20

我需要一个带有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 ;;

我在这里遗漏了一些明显的东西吗?

4

4 回答 4

30

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

module IntMap = Map.Make(struct type t = int let compare = compare end)
于 2012-04-12T22:06:37.027 回答
7

我认为您没有遗漏任何东西,没有标准模块。我相信 OCaml Batteries Included的BatInt模块可以满足您的需求。

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

于 2012-04-12T21:10:35.980 回答
2

IntMap 您可以使用 one-liner构建。如果您不介意使用第三方库,Jean-Christophe Filliâtre 的 Patricia 树库( Ptmap) 效率更高一些(Ptset对于 OCaml 整数集也是如此)。

于 2012-04-13T23:20:13.227 回答
0

If you happen to use containers already (which I think is a bit more commonplace since previous answers were written), you can conveniently use the containers 'primitive' modules along with the CCMap module to achieve this, e.g.:

module ByInt = CCMap.Make(CCInt)

于 2018-08-29T21:45:17.603 回答