2017-07-14 24 views
1

私はJane StreetのCore.stdを自分のプログラムで使用していますが、標準OCaml Mapを使いたいと思っています。しかし、memのような関数を呼び出すと、Core.stdのバージョンの署名が必要になります。この障害を乗り越えるにはどうすればいいですか?ありがとうございました!OCaml標準マップ対Jane Street Core.stdマップ

Error: This expression has type string but an expression was expected of type 
    'a PortTable.t = (string, 'a, PortTable.Key.comparator_witness) t 

私は標準のものを使用したい:それはMEMのCore.stdのバージョンではなく、標準のものを期待していますよう

open Core.Std 
open Map 

module PortTable = Map.Make(String) 
let portTable = PortTable.empty 
let string_add = (Int64.to_string packet.dlDst) in 
PortTable.mem string_add portTable 

これ

は、私のためにコンパイルされません。誰でも助けてくれれば大いに感謝します。ここで

答えて

4

Core.Stdライブラリーは、このように、Camlモジュールを介して標準ライブラリを公開し、あなたは標準の任意の値にアクセスすることができますただ例えばCaml.でその名を付けることによって、ライブラリ、

module PortableMap = Caml.Map.Make(String) 
3

は1つの提案です:

module StdMap = Map 
open Core.Std 

module PortTable = StdMap.Make(String) 

はここにそれがどのように動作するかを示すセッションの抜粋です:

# module PortTable = StdMap.Make(String);; 
module PortTable : 
    sig 
    type key = Core.Std.String.t 
    type 'a t = 'a Map.Make(Core.Std.String).t 
    val empty : 'a t 
    val is_empty : 'a t -> bool 
    val mem : key -> 'a t -> bool 
    ... 
    end 
# 

PortTableは、標準的なOCamlのMap.Makeファンクタから作成されたが、Stringがあるされていることコアからのもの同様のトリックを使用して、標準OCaml Stringモジュールの名前を保持することができます。

(個人的に、私はStdMapモジュールを開いていないだろう。名前空間はすでにかなり混雑している。)

+0

ローカルモジュールは、混雑した名前空間 –

+0

@NickZuberを持っている場合は特に、コア・ライブラリーが設計され、あまりにも代わりにグローバルファイル内のモジュールを開くここでは価値があるかもしれませんが開きますそのようなy、Core.Stdを開く必要があります。これは、標準ライブラリをオーバーレイしているためです。 – ivg

+0

@ivg私はここでMapモジュールを指していました。 –

関連する問題