如果我有两个模块A和B,并在模块A中定义一个类型,
type t1 = THIS of int | THAT of char
然后想在模块B中进行一些模式匹配或构造该类型的对象,我必须使用像
这样的东西A.THIS(3)
这就是它迫使我做的事情,即使在我有一些声明如
之后type t2 = A.t1
在模块的签名和实现中。如果我想减少冗长而不使用'A'怎么办?在模块B?我可以创建一个全新的类型和一个函数来将一个转换为另一个,但这看起来很笨重。有什么我想念的吗?
答案 0 :(得分:7)
您可以使用open
关键字,类似于Java的import
:
module A = struct
type t1 = THIS of int | THAT of char
end
module B = struct
open A
let b = THIS 3
end
如果您想避免污染模块B
的全局命名空间,可以使用OCaml 3.12中引入的the let open ... in ...
expression:
module A = struct
type t1 = THIS of int | THAT of char
end
module B = struct
let b = let open A in THIS 3
end
在某些特殊(且相对罕见)的情况下,您可能希望或必须使用include
关键字而不是open
。您可以在OCaml手册的Opening a module path和Including the components of another structure部分找到有关它们差异的良好解释。
答案 1 :(得分:4)
我不是模块专家,但你可以这样做(我刚测试过):
(在b.ml中):
type t1 = A.t1 = THIS of int | THAT of char
当然,您也可以open
A模块。这通常对我来说太激烈了。为了减少激烈程度,您可以在第三个模块中定义类型,并在A和B中打开它。