int键的OCaml映射::其中是';简单';要与映射一起使用的int模块。是否生成函子?

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

我需要一个带有int类型键的OCaml映射,所以我使用map.Make创建一个。然而,似乎“唯一”提供了需要转换的模块,如Big_intInt32Int64Nativeint。所以我必须做一些事情,比如:

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)