我需要一个带有int类型键的OCaml映射,所以我使用Map.Make创建一个。然而,似乎standard modules'only'提供了需要转换的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 ;;
我错过了一些明显的东西吗?
拥有int映射的最简单方法是执行以下操作:
module IntMap = Map.Make(struct type t = int let compare = compare end)
我不认为你错过任何东西,没有标准的模块。我相信BatInt的OCaml Batteries Included模块做你想要的。
(编辑补充:这是真的,我自己使用托马斯建议的方法!)
你可以建立IntMap
with a one-liner。如果您不介意使用第三方库,Jean-Christophe Filliâtre's Patricia tree library(Ptmap
)效率会更高(并且类似于OCaml整数集的Ptset
)。
如果你碰巧已经使用过containers
(我认为自从之前的答案写完之后我认为它更常见),你可以方便地使用容器的“原始”模块和CCMap模块来实现这一点,例如:
module ByInt = CCMap.Make(CCInt)