OCaml类型/模块

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?我可以创建一个全新的类型和一个函数来将一个转换为另一个,但这看起来很笨重.有什么我想念的吗?

dki*_*kim 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
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手册的其他结构部分的组件中找到有关它们差异的良好解释.


Jef*_*eld 5

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

(以 b.ml 计):

type t1 = A.t1 = THIS of int | THAT of char
Run Code Online (Sandbox Code Playgroud)

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