3

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

type t1 = THIS of int | THAT of char

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

A.THIS(3)

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

type t2 = A.t1

在模块的签名和实现中。如果我想不那么冗长而不使用“A”怎么办?在模块 B 中?我可以制作一种全新的类型和一个将一种转换为另一种的函数,但这似乎很笨重。有什么我想念的吗?

4

2 回答 2

8

您可以使用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

如果要避免污染 module 的全局命名空间,B可以使用表达式let open ... in ...它是在 OCaml 3.12 中引入的:

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 手册的打开模块路径包含另一个结构的组件部分中找到关于它们差异的很好的解释。

于 2012-08-04T05:17:55.650 回答
5

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

(以 b.ml 计):

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

当然,您也可以open使用 A 模块。通常这对我的口味来说太激烈了。为了让它不那么激烈,您可以在第三个模块中定义类型并在 A 和 B 中打开它。

于 2012-08-04T05:14:30.110 回答