我需要一个带有 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 ;;
我错过了一些明显的东西吗?
答案 0 :(得分:27)
拥有int map的最简单方法是执行以下操作:
module IntMap = Map.Make(struct type t = int let compare = compare end)
答案 1 :(得分:7)
我不认为你错过任何东西,没有标准的模块。我相信 BatInt的OCaml Batteries Included模块可以满足您的需求。
(编辑补充:这是真的,我自己使用托马斯建议的方法!)
答案 2 :(得分:2)
您可以构建IntMap
with a one-liner。如果您不介意使用第三方库,Jean-Christophe Filliâtre's Patricia tree library(Ptmap
)会更高效(对于OCaml整数集,类似Ptset
)。
答案 3 :(得分:0)
如果您碰巧已经使用过containers
(我认为自从写了以前的答案以来,这已经很普遍了),则可以方便地使用容器的“原始”模块和CCMap模块来实现此目的,例如:
module ByInt = CCMap.Make(CCInt)