我应该如何初始化我的元组列表
How should I initialize my list of tuples
我有一个函数,它接受一个元组列表并对其进行处理以获得一个包含 3 个整数的元组。
我现在想用我创建的元组类型列表对其进行测试,但我无法创建此列表。
这是我的元组类型:
type t_votes = {valeur : string ; nombre : int };;
这是我的功能:
let rec recap (l : t_votes list) : int * int * int =
let (nb_oui,nb_non,nb_blanc) = recap(tl(l)) in
if (l=[]) then
(0,0,0)
else if ((hd(l)).valeur = "oui") then
(nb_oui+(hd(l)).nombre ,nb_non,nb_blanc)
else if ((hd(l)).valeur = "non") then
(nb_oui, nb_non + (hd(l)).nombre, nb_blanc)
else if ((hd(l)).valeur = "blanc") then
(nb_oui,nb_non,nb_blanc+(hd(l)).nombre)
else
failwith("liste invalide")
;;
这是我徒劳地尝试声明一个列表来测试我的功能:
let liste_votes : t_votes list = [("oui",120);("non",18);("blanc",20);("oui",20);("non",24);("blanc",25)];;
recap(liste_votes );;
这是图阿雷格人给我的:
# let liste_votes : t_votes list = [("oui",120);("non",18);("blanc",20);("oui",20);("non",24);("blanc",25)];;
Characters 34-45:
let liste_votes : t_votes list = [("oui",120);("non",18);("blanc",20);("oui",20);("non",24);("blanc",25)];;
^^^^^^^^^^^
Error: This expression has type 'a * 'b
but an expression was expected of type t_votes
要创建记录类型的值(因为它是记录类型而不是元组,所以元组不会命名其参数),语法如下:
{ valeur = "Some string" ; nombre = 13 }
如果这种语法对你来说太重了,通常的做法是编写一个构建器函数:
let mk_vote valeur nombre = { valeur ; nombre }
这里我使用另一种语法来实例化记录值,而不使用 =
符号。在那种情况下,它与编写 valeur = valeur
和 nombre = nombre
.
相同
然后你可以写:
let votes = [ mk_vote "oui" 120 ; mk_vote "non" 18 ; mk_vote "blanc" 20 ; mk_vote "oui" 20 ; mk_vote "non" 24 ; mk_vote "blanc" 25 ]
let mk_vote (valeur, nombre) = { valeur ; nombre }
也行,让你写
let votes = List.map mk_vote [("oui",120);("non",18);("blanc",20);("oui",20);("non",24);("blanc",25)]
对于某些 vote
的记录类型,您可以使用 vote.valeur
和 vote.nombre
访问字段。
您还可以使用模式匹配:
match vote with
| { valeur = v ; nombre = n } => (* ... *)
您也可以像这样从另一个记录值:
let vote = { valeur = "Some string" ; nombre = 13 } in
let vote' = { vote with valeur = "Some other string" } in
(* ... *)
那么vote'.valeur
就是"Some other string"
而vote'.nombre
就是vote.nombre
,
或 13
在这种情况下。
最后我忍不住注意到你使用字符串来表示不同类型的投票,因为似乎只有三种情况,专用类型会更相关(毕竟你使用的是 ocaml,它可以让你正确处理数据)。
type vote_kind =
| Yes
| No
| Blank
type t_votes = {
value : vote_kind ;
amount : int ;
}
我有一个函数,它接受一个元组列表并对其进行处理以获得一个包含 3 个整数的元组。 我现在想用我创建的元组类型列表对其进行测试,但我无法创建此列表。
这是我的元组类型:
type t_votes = {valeur : string ; nombre : int };;
这是我的功能:
let rec recap (l : t_votes list) : int * int * int =
let (nb_oui,nb_non,nb_blanc) = recap(tl(l)) in
if (l=[]) then
(0,0,0)
else if ((hd(l)).valeur = "oui") then
(nb_oui+(hd(l)).nombre ,nb_non,nb_blanc)
else if ((hd(l)).valeur = "non") then
(nb_oui, nb_non + (hd(l)).nombre, nb_blanc)
else if ((hd(l)).valeur = "blanc") then
(nb_oui,nb_non,nb_blanc+(hd(l)).nombre)
else
failwith("liste invalide")
;;
这是我徒劳地尝试声明一个列表来测试我的功能:
let liste_votes : t_votes list = [("oui",120);("non",18);("blanc",20);("oui",20);("non",24);("blanc",25)];;
recap(liste_votes );;
这是图阿雷格人给我的:
# let liste_votes : t_votes list = [("oui",120);("non",18);("blanc",20);("oui",20);("non",24);("blanc",25)];;
Characters 34-45:
let liste_votes : t_votes list = [("oui",120);("non",18);("blanc",20);("oui",20);("non",24);("blanc",25)];;
^^^^^^^^^^^
Error: This expression has type 'a * 'b
but an expression was expected of type t_votes
要创建记录类型的值(因为它是记录类型而不是元组,所以元组不会命名其参数),语法如下:
{ valeur = "Some string" ; nombre = 13 }
如果这种语法对你来说太重了,通常的做法是编写一个构建器函数:
let mk_vote valeur nombre = { valeur ; nombre }
这里我使用另一种语法来实例化记录值,而不使用 =
符号。在那种情况下,它与编写 valeur = valeur
和 nombre = nombre
.
然后你可以写:
let votes = [ mk_vote "oui" 120 ; mk_vote "non" 18 ; mk_vote "blanc" 20 ; mk_vote "oui" 20 ; mk_vote "non" 24 ; mk_vote "blanc" 25 ]
let mk_vote (valeur, nombre) = { valeur ; nombre }
也行,让你写
let votes = List.map mk_vote [("oui",120);("non",18);("blanc",20);("oui",20);("non",24);("blanc",25)]
对于某些 vote
的记录类型,您可以使用 vote.valeur
和 vote.nombre
访问字段。
您还可以使用模式匹配:
match vote with
| { valeur = v ; nombre = n } => (* ... *)
您也可以像这样从另一个记录值:
let vote = { valeur = "Some string" ; nombre = 13 } in
let vote' = { vote with valeur = "Some other string" } in
(* ... *)
那么vote'.valeur
就是"Some other string"
而vote'.nombre
就是vote.nombre
,
或 13
在这种情况下。
最后我忍不住注意到你使用字符串来表示不同类型的投票,因为似乎只有三种情况,专用类型会更相关(毕竟你使用的是 ocaml,它可以让你正确处理数据)。
type vote_kind =
| Yes
| No
| Blank
type t_votes = {
value : vote_kind ;
amount : int ;
}