因此,当您定义模块的结构时,可以从其中扩展另一个模块:
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}}
使用这种递归模块技巧时,你不能扩展模块吗?我误解了什么或做错了什么?
答案 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的回答,rec
和include
的组合是有问题的。可能,摆脱include
就足够了。