在ocaml中包含模块内的所有模块

时间:2017-07-20 18:33:11

标签: module ocaml

想象一下,我有一系列模块A1..An B1..Bn,所有这些模块都是一个完整的编译单元。现在我定义了两个新模块,这些模块是嵌套的:

(* A.mli *)
module A : sig
  module A1
  ...
  module An
end
(* A.ml *)
module A1 = A1
..
module An = An

(* B.mli *)
module B : sig
  open A
  module B1
  ...
  module Bn
end
(* B.ml *)
module B1 = B1
..
module Bn = Bn

因此使用模块别名重新导出原始模块。请注意,B中的模块可能引用A1..An中的模块中的类型!

现在,我想创建一个新模块AB,使签名为:

module AB : sig
  module A1
  ...
  module An

  module B1
  ...
  module Bn
end

但是我不想听所有单个模块,只是为了重新出口内容。也不允许使用-open。我能想到的最好的是:

module AB : sig
  include module type of struct include A end
  include module type of struct include B end
end

然而,这会失败,因为我们丢失了之间的联系,比如说A.A1.tA1.t。有没有办法实现我想要的?感谢。

1 个答案:

答案 0 :(得分:0)

看起来以下情况可行:

module AB : sig
  include A
  include B
end

module type of生成类型摘要,因此您需要添加with type ...约束,这对嵌套模块来说很麻烦)