如何在OCaml中从列表初始化映射?

如何在OCaml中从列表初始化映射?,ocaml,Ocaml,使用Map.empty和Map.add是冗长的,是否有类似于: 列表图[1,A;2,B;3,C];; 我不确定以下是否是最好的方法,但它可能会有所帮助: 你可以用 以及: 模块M=Map.Make Int 设m=[1,A;2,B;3,C]|>List.to|seq |>m.of|seq 随着时间的推移,它可能是这样的: 让m=List.fold\u left fun m k,v->m.add k v m m.empty[1,A;2,B;3,C] 图书馆还提供: *打开容器以更换模块* 敞口集装箱

使用Map.empty和Map.add是冗长的,是否有类似于:

列表图[1,A;2,B;3,C];;
我不确定以下是否是最好的方法,但它可能会有所帮助:

你可以用 以及:

模块M=Map.Make Int 设m=[1,A;2,B;3,C]|>List.to|seq |>m.of|seq 随着时间的推移,它可能是这样的:

让m=List.fold\u left fun m k,v->m.add k v m m.empty[1,A;2,B;3,C] 图书馆还提供:

*打开容器以更换模块* 敞口集装箱 模块M=Map.Make Int *或者显式地使用扩展模块* 模块M=CCMap.Make Int 设m=m.of_列表[1,A;2,B;3,C]
我不确定以下是否是最好的方法,但它可能会有所帮助:

你可以用 以及:

模块M=Map.Make Int 设m=[1,A;2,B;3,C]|>List.to|seq |>m.of|seq 随着时间的推移,它可能是这样的:

让m=List.fold\u left fun m k,v->m.add k v m m.empty[1,A;2,B;3,C] 图书馆还提供:

*打开容器以更换模块* 敞口集装箱 模块M=Map.Make Int *或者显式地使用扩展模块* 模块M=CCMap.Make Int 设m=m.of_列表[1,A;2,B;3,C] 如果正在使用,则Base的地图模块将显示:

如果您确定列表中没有重复项,则可以调用。

如果您正在使用,Base的地图模块将显示:


如果您确定您的列表中没有重复项,您可以致电。

我是一个完全的OCaml noob,这似乎正是我想要的,特别是列表中的第一部分-映射。你为什么说这可能不是最好的方法?这不是惯用语,还是在其他方面不好?我这么说是因为我也不是OCaml专家。第一种方法使用中间表示,使用Seq。它将一个函数包装成一个变量,并使外部迭代某些结构成为可能。然而,这使得它比第二种方法稍微慢了约2%。这两种方法都是尾部递归的,of_seq还使用fold逐个添加元素。标准库扩展容器以与方法2相同的方式执行此操作:我是一个完全的OCAMLNoob,这似乎正是我在寻找的,特别是列表中的第一部分映射。你为什么说这可能不是最好的方法?这不是惯用语,还是在其他方面不好?我这么说是因为我也不是OCaml专家。第一种方法使用中间表示,使用Seq。它将一个函数包装成一个变量,并使外部迭代某些结构成为可能。然而,这使得它比第二种方法稍微慢了约2%。这两种方法都是尾部递归的,of_seq还使用fold逐个添加元素。标准库扩展容器的方法与方法2相同:
Map.of_alist (module Int) [(1, "A"); (2, "B"); (3, "C")];;