我应该如何初始化我的元组列表

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 = valeurnombre = 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.valeurvote.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 ;
}