int键的OCaml映射:: where是用于Map.Make仿函数的'simple'int模块?

时间:2012-04-12 21:02:06

标签: ocaml

我需要一个带有 int 类型键的OCaml映射,所以我使用 Map.Make 创建一个。但是,似乎standard modules'只提供 Big_int Int32 Int64 Nativeint 需要转换。所以我必须做以下事情:

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 ;;

我错过了一些明显的东西吗?

4 个答案:

答案 0 :(得分:27)

拥有int map的最简单方法是执行以下操作:

module IntMap = Map.Make(struct type t = int let compare = compare end)

答案 1 :(得分:7)

我不认为你错过任何东西,没有标准的模块。我相信 BatIntOCaml Batteries Included模块可以满足您的需求。

(编辑补充:这是真的,我自己使用托马斯建议的方法!)

答案 2 :(得分:2)

您可以构建IntMap with a one-liner。如果您不介意使用第三方库,Jean-Christophe Filliâtre's Patricia tree libraryPtmap)会更高效(对于OCaml整数集,类似Ptset)。

答案 3 :(得分:0)

如果您碰巧已经使用过containers(我认为自从写了以前的答案以来,这已经很普遍了),则可以方便地使用容器的“原始”模块和CCMap模块来实现此目的,例如:

module ByInt = CCMap.Make(CCInt)