第 12 章 语言扩展

6 恢复模块的类型

(在 OCaml 3.12 中引入)

module-type::= ...
 moduletypeofmodule-expr

构造 module type of module-expr 展开为为模块表达式 module-expr 推断出的模块类型(签名或函子类型)。为了使这种模块类型在许多情况下可重用,它故意没有被加强:抽象类型和数据类型没有与原始模块的类型明确关联。出于同样的原因,推断类型中的模块别名会被展开。

一个典型的用法,结合签名级别的 include 结构,是扩展现有结构的签名。在这种情况下,人们希望保持类型等于原始模块中的类型。这可以使用以下惯用法来完成。

module type MYHASH = sig include module type of struct include Hashtbl end val replace: ('a, 'b) t -> 'a -> 'b -> unit end

然后签名 MYHASH 包含模块 Hashtbl 签名的所有字段(类型定义已加强),以及新的字段 replace。通过再次使用 include 结构可以轻松地获得此签名的实现,但这次是在结构级别

module MyHash : MYHASH = struct include Hashtbl let replace t k v = remove t k; add t k v end

另一个不加强很有用的应用是为现有模块提供替代实现。

module MySet : module type of Set = structend

此惯用法保证 Myset 与 Set 兼容,但允许它以不同的方式在内部表示集合。