扩展递归模块

时间:2017-04-19 17:49:54

标签: module ocaml

因此,当您定义模块的结构时,可以从其中扩展另一个模块:

module rec Base : sig
  type t = | Name of string
end = Base

and Child : sig
  include Base
end = Child

但是,在使用recursive modules using recursive signatures时,我在尝试扩展模块时会遇到问题:

Error: Unbound module type Base

当我这样做时,我收到一个错误说:

{{1}}

使用这种递归模块技巧时,你不能扩展模块吗?我误解了什么或做错了什么?

2 个答案:

答案 0 :(得分:1)

在我看来,你的问题是Base是一个模块,而不是一个模块类型。在sig ... end构造中包含时,您需要一个类型。在struct ... end构造中包含时,您需要一个模块。这就是为什么第一个例子有效,第二个例子没有。

如果我将Base更改为module type of Base,我会收到此错误:

Error: Illegal recursive module reference

所以我怀疑这种特殊的(有些奇怪的)类型的递归定义是不受支持的。

如果单独定义模块类型,则可以使其工作:

module type BASE = sig type t = Name of string end

module rec Base : BASE = Base

and Child : sig
    include BASE
end = Child

答案 1 :(得分:0)

杰弗里斯科菲尔德已经给出了一个很好的答案。我想补充说include只是语法糖。因此,如果include导致您遇到麻烦,解决方案可能是扩展它。在您的第一个示例中,将导致

module Base = struct
  type t = Name of string
end

module Child = struct
  type t = Name of string
end

显然,您的示例是您真正想要做的简化版本。如图所示,根本不需要使用rec。所以我只能猜测你真正需要多少递归。根据Jeffrey Scofield的回答,recinclude的组合是有问题的。可能,摆脱include就足够了。