Types 在模块外部使用开放式联合体,这些联合体是在模块中定义的

Types 在模块外部使用开放式联合体,这些联合体是在模块中定义的,types,ocaml,variant,Types,Ocaml,Variant,为什么这样做很好 module Account = struct type account_type = Current of float | Savings of float end let sarah = Account.Current 100.0;; 而下面的最后一行产生了一个错误:语法错误 module Account = struct type 'a account_type = [> `Current of float | `Savings of float ]

为什么这样做很好

module Account = struct

 type account_type = Current of float | Savings of float

end

let sarah = Account.Current 100.0;;
而下面的最后一行产生了一个
错误:语法错误

module Account = struct

  type 'a account_type = [> `Current of float | `Savings of float ] as 'a

end

let pete = Account.`Current 100.0;;
也就是说,为什么我不能在不打开模块的情况下在模块外部使用open union类型?我应该说我发现将最后一行更改为:

open Account;;
let pete = `Current 100.0;;
工作正常,但如果我经常使用
account\u type
,或者我必须在使用
account\u type
的任何代码部分的开头打开
account
,这显然是很麻烦的,这意味着我会牺牲通过使用
account
的签名而获得的抽象 我浏览了好几篇OCaml教程以及INRIA文档,没有找到任何关于您是如何做到这一点的内容。
是否可以避免每次使用
帐户类型时都必须打开模块

提前感谢,


Zach

在第二个示例中,您实际上根本不必
开立账户
,语法就是
`Current 100.0
。多态变体标记不参与任何特定类型。
`Current
的类型是
[>`Current]
,这(
)意味着该类型至少是
`Current
,并且由于该类型是该函数接受的类型的子集,因此它可以正常编译。您可以将相同的值传递给许多接受相同名称的多态变量的函数。当然,缺少静态类型信息,键入错误和情况可能变得相当复杂


讨论了它们的一些优点和用例。

多态变量常量(如
`Current
)是全局定义的,类似于整数常量。您不会说
Account.10
来引用
Account
模块中的整数10

这是多态变体的优点(和缺点),您可以使用它们而不必定义它们(就像在使用之前不必定义10)

因此,正如nlucaroni所说,您不必打开
帐户
模块就可以访问
`Current

与整数不同,多态变量也可以采用参数(如您的
`Current 100.0
)。但是参数的数量和类型并不是固定的,对于同一个构造函数,它们甚至可以在代码中的不同位置发生变化。因此,nlucaroni也提到了复杂性


[格式说明:要在打字机样式的文本中显示单反引号,
,,降价惯例是使用双反引号将文本括起来。这使得文本中只保留单反引号。或者至少对我有效。]

啊,我尝试用反引号转义反引号,从而给所有相关人员造成了大量的混乱。