OCaml标准地图与Jane Street Core.std地图

时间:2017-07-14 15:52:12

标签: dictionary ocaml core

所以我在我的程序中使用Jane Street的Core.std来处理某些事情,但仍然想使用标准的OCaml Map。但是,当我调用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

这不会为我编译,因为它期待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

我只想使用标准版。如果有人能提供帮助,那将非常感激。

2 个答案:

答案 0 :(得分:4)

Core.Std库通过Caml模块公开标准库,因此,您可以通过在其名称前添加Caml.来访问标准库中的任何值,例如

module PortableMap = Caml.Map.Make(String)

答案 1 :(得分: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的。{1}}。您可以使用类似的技巧来保留标准OCaml String模块的名称。

(就个人而言,我不打开StdMap模块;命名空间已经非常拥挤。)