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也提到了复杂性
[格式说明:要在打字机样式的文本中显示单反引号,
,,降价惯例是使用双反引号将文本括起来。这使得文本中只保留单反引号。或者至少对我有效。]啊,我尝试用反引号转义反引号,从而给所有相关人员造成了大量的混乱。