OCaml类型/模块

时间:2012-08-04 04:52:19

标签: types module ocaml

如果我有两个模块A和B,并在模块A中定义一个类型,

type t1 = THIS of int | THAT of char

然后想在模块B中进行一些模式匹配或构造该类型的对象,我必须使用像

这样的东西
A.THIS(3)

这就是它迫使我做的事情,即使在我有一些声明如

之后
type t2 = A.t1

在模块的签名和实现中。如果我想减少冗长而不使用'A'怎么办?在模块B?我可以创建一个全新的类型和一个函数来将一个转换为另一个,但这看起来很笨重。有什么我想念的吗?

2 个答案:

答案 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 pathIncluding the components of another structure部分找到有关它们差异的良好解释。

答案 1 :(得分:4)

我不是模块专家,但你可以这样做(我刚测试过):

(在b.ml中):

type t1 = A.t1 = THIS of int | THAT of char

当然,您也可以open A模块。这通常对我来说太激烈了。为了减少激烈程度,您可以在第三个模块中定义类型,并在A和B中打开它。