module - 在 OCaml 中,是否可以根据 Set 定义 Map?

标签 module ocaml functor

我已经在 OCaml 中实现了集合(平衡搜索树)的表示。它实际上是一个仿函数 Make签名的

module Make :
  functor (T : ORDERED_TYPE) ->
sig
  type elt = T.t
  type t
  val empty : t
  val cons : elt -> t -> t
  val delete : elt -> t -> t
  val mem : elt -> t -> bool
  val cardinal : t -> int
end

在哪里
 module type ORDERED_TYPE = sig type t val compare : t -> t -> int end

现在我想实现一个像 Map 这样的字典。在标准库中。它必须有一个像这样的签名
 module Make: functor (T : ORDERED_TYPE) -> sig
    type key = T.t
    type +'a t
    ...
 end

在哪里 t是字典的类型。

再次实现平衡搜索树并不优雅,所以我想根据上面实现为仿函数的集合来定义字典。我可以这样做吗?

最佳答案

正如 Jeffrey 所说,您 Set接口(interface)不够表达,无法方便地实现Map在它的上面。实现 Set 会更简单来自 Map ,通过将集合定义为从键到单位值的映射。

我建议的另一种可能性是,首先公开一个没有封装的平衡搜索树模块,其唯一目的是提供一个完全由接口(interface)显示的有效数据结构。然后,您可以自由地将它重用于您喜欢的任何数据结构,包括 MapSet ,而不必玩游戏来定义另一个。在这种情况下,这可能不是非常重要(从 Set 定义 Map 对于大多数用途来说是合理的),但在我看来,在一般情况下这是一个更好的设计。

简而言之:如果你想重用实现,那么暴露“实现模块”,并在它们之上定义你的“接口(interface)模块”。

关于module - 在 OCaml 中,是否可以根据 Set 定义 Map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369546/

相关文章:

module - 如何强制 npm 3 安装嵌套依赖项?

javascript - 将参数作为可选参数传递给 ES6 模块

python - opencv 3.0 beta 创建新模块(可在 Python 中使用)

oop - 为什么使用类类型时,OCAML 对象中未绑定(bind)的类型变量不出现?

javascript - 使用模块模式在 YUI3 中创建自定义模块

floating-point - OCaml是否具有类似C的round()和trunc()函数?

ocaml - 在 OCaml utop 中使用多个模块

c++ - STL/Boost 中的仿函数,它从指针中提取值

c++ - 在 C++ 中使用模板化方法交替传递仿函数和函数指针

scala - Hom Functor 的逆变和Scala 的Function1 之间有什么联系吗?