int键的OCaml映射::其中是';简单';要与映射一起使用的int模块。是否生成函子?
我需要一个带有int类型键的OCaml映射,所以我使用map.Make创建一个。然而,似乎“唯一”提供了需要转换的模块,如Big_int、Int32、Int64和Nativeint。所以我必须做一些事情,比如:int键的OCaml映射::其中是';简单';要与映射一起使用的int模块。是否生成函子?,ocaml,Ocaml,我需要一个带有int类型键的OCaml映射,所以我使用map.Make创建一个。然而,似乎“唯一”提供了需要转换的模块,如Big_int、Int32、Int64和Nativeint。所以我必须做一些事情,比如: module IntMap = Map.Make(Int32) let a_map = IntMap.add (Int32.of_int 0) "zero" IntMap.empty ;; 。。。我宁愿避免或定义我自己的愚蠢的Int模块处理简单的Int文本或值,而不需要转换函数: m
module IntMap = Map.Make(Int32)
let a_map = IntMap.add (Int32.of_int 0) "zero" IntMap.empty ;;
。。。我宁愿避免或定义我自己的愚蠢的Int模块处理简单的Int文本或值,而不需要转换函数:
module Int = struct
type t = int
let compare x y = if x < y then -1 else if x > y then 1 else 0 end ;;
module IntMap = Map.Make(Int)
let a_map = IntMap.add 0 "zero" IntMap.empty ;;
module Int=struct
类型t=int
让我们比较xy=如果xy,则1否则0结束;;
模块IntMap=Map.Make(Int)
让a_map=IntMap.add 0“zero”IntMap.empty;;
我是不是遗漏了一些明显的东西?我不认为您遗漏了任何东西,这方面没有标准模块。我相信 模块做你想做的
(编辑添加:没错,我自己使用Thomas建议的方法!)创建int映射的最简单方法是执行以下操作:
module IntMap = Map.Make(struct type t = int let compare = compare end)
您可以构建
IntMap
。如果您不介意使用第三方库,(Ptmap
)的效率更高一些(对于OCaml整数集也是如此)。如果您碰巧已经使用了容器(我认为这在前面的答案编写之后更为常见),您可以方便地使用容器“基本”模块和CCMap模块来实现这一点,例如:
module ByInt=CCMap.Make(CCInt)
只需使用pervisives.compare
。出于效率原因,您可能更愿意向compare函数添加类型注释:inline模块IntMap=Map.Make(struct type t=int let compare:int->int->int->int=compare end)
@PierreChambart您有这样做的用例吗?这两个生成的lambda代码看起来与我相似。实际上,我不知道为什么,但在这种情况下,我无法让编译器专门将compare作为compare_int进行比较。在ocamlc版本3.11.2中,行:module IntMap=Map.Make(struct type t=int let compare=compare end)
失败,预期为“语法错误:”),突出显示的(“可能是不匹配的”(ocamlc-c调用中类似的错误消息)此错误可能发生在tuareg模式的顶层(因为tuareg模式中有一个bug),但通常在3.11.2中编译良好(但我还没有测试它)。您仍然可以执行以下操作:module Int=struct type t=Int let compare=compare end
和module IntMap=Map.Make(Int)