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

私はあなたが何かを逃しているとは思わない、これのための標準的なモジュールはありません。OCamlBatteriesIncludedのBatIntモジュールはあなたが望むことをするだろうと私は信じて います。

(追加するために編集:それは本当です、私自身はトーマスによって提案された方法を使用します!)

于 2012-04-12T21:10:35.980 に答える
2

IntMap ワンライナーで構築できます。サードパーティのライブラリを使用してもかまわない場合は、Jean-ChristopheFilliâtreのPatriciaツリーライブラリPtmap)の方が少し効率的です(PtsetOCaml整数のセットの場合も同様です)。

于 2012-04-13T23:20:13.227 に答える
0

すでに使用している場合containers(以前の回答が書かれてからもう少し一般的だと思います)、CCMapモジュールと一緒にコンテナの「プリミティブ」モジュールを便利に使用して、これを実現できます。例:

module ByInt = CCMap.Make(CCInt)

于 2018-08-29T21:45:17.603 に答える