OCaml类型/模块

3
如果我有两个模块A和B,并在模块A中定义了一个类型,
type t1 = THIS of int | THAT of char

如果我想在模块B中进行一些模式匹配或构建该类型的对象,我需要使用类似于以下代码:

A.THIS(3)

这是它强制我要做的事情,即使我有像这样的陈述:
type t2 = A.t1

在模块的签名和实现中,如果我想要更简洁地不在模块B中使用 'A.',该怎么办?我可以创建一个全新的类型和一个将其转换为另一个类型的函数,但这似乎很笨拙。我是否有什么遗漏的东西?


请注意,在OCaml中通常的风格是写This而不是THIS,即仅将构造函数的第一个字母大写。 - jrouquie
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

如果您想避免污染模块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

在一些特殊的(而且相对罕见的)情况下,您可能需要使用include关键字而不是open。您可以在OCaml手册的打开模块路径包含另一个结构的组件部分中找到它们之间差异的良好解释。


5

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

(在 b.ml 中):

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

当然,您也可以打开模块A。但我认为这样做过于激进了。为了减少其影响,您可以在第三个模块中定义类型,并在A和B中同时打开。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接