use*_*618 3 ocaml types module
如果我有两个模块A和B,并在模块A中定义一个类型,
type t1 = THIS of int | THAT of char
Run Code Online (Sandbox Code Playgroud)
然后想要在模块B中进行一些模式匹配或构造该类型的对象,我必须使用类似的东西
A.THIS(3)
Run Code Online (Sandbox Code Playgroud)
这就是它迫使我做的事情,即使在我有一些陈述之后
type t2 = A.t1
Run Code Online (Sandbox Code Playgroud)
在模块的签名和实现中.如果我想减少冗长而不使用'A'怎么办?在模块B?我可以创建一个全新的类型和一个函数来将一个转换为另一个,但这看起来很笨重.有什么我想念的吗?
您可以使用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
Run Code Online (Sandbox Code Playgroud)
如果您想避免污染模块的全局命名空间,B
可以使用OCaml 3.12中引入的let open ... in ...
表达式:
module A = struct
type t1 = THIS of int | THAT of char
end
module B = struct
let b = let open A in THIS 3
end
Run Code Online (Sandbox Code Playgroud)
在某些特殊(且相对罕见)的情况下,您可能希望或必须使用include
关键字而不是open
.您可以在打开模块路径和包含 OCaml手册的其他结构部分的组件中找到有关它们差异的良好解释.
我不是模块专家,但你可以这样做(我刚刚测试过):
(以 b.ml 计):
type t1 = A.t1 = THIS of int | THAT of char
Run Code Online (Sandbox Code Playgroud)
open
当然,您也可以使用 A 模块。通常这对我的口味来说太激烈了。为了让它不那么激烈,您可以在第三个模块中定义类型并在 A 和 B 中打开它。