Types OCaml类型/模块
如果我有两个模块A和B,并在模块A中定义一个类型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.”,那该怎么办?我可以创建一个全新的类型和一个函数来将一个转换为另一个,但这看起来很笨拙。有什么我遗漏的吗?我不是模块专家,但你可以做到这一点
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