Types OCaml类型/模块

Types OCaml类型/模块,types,module,ocaml,Types,Module,Ocaml,如果我有两个模块A和B,并在模块A中定义一个类型 type t1 = THIS of int | THAT of char 然后要在模块B中进行模式匹配或构造这种类型的对象,我必须使用 A.THIS(3) 这就是它迫使我去做的,即使在我有了这样的陈述之后 type t2 = A.t1 在模块的签名和实现中。如果我不想太冗长,也不想在模块B中使用“A.”,那该怎么办?我可以创建一个全新的类型和一个函数来将一个转换为另一个,但这看起来很笨拙。有什么我遗漏的吗?我不是模块专家,但你可以做到这一点

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

type t1 = THIS of int | THAT of char
然后要在模块B中进行模式匹配或构造这种类型的对象,我必须使用

A.THIS(3)
这就是它迫使我去做的,即使在我有了这样的陈述之后

type t2 = A.t1

在模块的签名和实现中。如果我不想太冗长,也不想在模块B中使用“A.”,那该怎么办?我可以创建一个全新的类型和一个函数来将一个转换为另一个,但这看起来很笨拙。有什么我遗漏的吗?

我不是模块专家,但你可以做到这一点(我刚刚测试了它):

(单位:b.ml):


当然,您也可以
打开
A模块。这对我的口味来说往往太过激了。为了使它不那么激烈,您可以在第三个模块中定义类型,并在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
如果要避免污染模块
B
的全局命名空间,可以使用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手册的和部分中找到关于它们差异的很好的解释。

请注意,OCaml中通常的风格是编写
This
,而不是
This
,即仅大写构造函数的第一个字母。
module A = struct
  type t1 = THIS of int | THAT of char
end

module B = struct
  let b = let open A in THIS 3
end