2017-07-14 50 views
1

因此,我在我的程序中使用Jane Street的Core.std來處理某些事情,但仍想使用標準OCaml映射。但是,當我調用像mem這樣的函數時,它期待着Core.std版本的簽名。我如何克服這個障礙?謝謝!OCaml標準映射vs.簡街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 

這不會編譯對我來說,因爲它的預期Core.std的版本MEM的,不是標準之一:

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

我只是想使用標準之一。如果有人可以幫助,將不勝感激。

回答

4

Core.Std庫通過Caml模塊暴露標準庫,因此,您可以從標準訪問任何價值通過只是Caml.如前綴名稱庫,

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

這裏有一個建議:

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是來自Core的。您可以使用類似的技巧來保留標準OCaml字符串模塊的名稱。

(就個人而言,我不會打開StdMap模塊;命名空間已經相當擁擠。)

+0

本地打開可能是值得在這裏過,而不是在文件打開全球的一個模塊,尤其是當一個模塊有一個擁擠的命名空間 –

+0

@NickZuber,核心庫的設計在這樣的窪地y,你應該打開Core.Std,因爲它是覆蓋標準庫。 – ivg

+0

@ivg我在這裏指的是Map模塊 –