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

问题描述 投票:18回答:4

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

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

ocaml
4个回答
27
投票

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

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

7
投票

我不认为你错过任何东西,没有标准的模块。我相信BatIntOCaml Batteries Included模块做你想要的。

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


2
投票

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


0
投票

如果你碰巧已经使用过containers(我认为自从之前的答案写完之后我认为它更常见),你可以方便地使用容器的“原始”模块和CCMap模块来实现这一点,例如:

module ByInt = CCMap.Make(CCInt)

© www.soinside.com 2019 - 2024. All rights reserved.