types - 在定义它们的模块之外使用开放联合

标签 types ocaml variant

为什么这很好用?

module Account = struct

 type account_type = Current of float | Savings of float

end

let sarah = Account.Current 100.0;;

虽然下面的最后一行产生 Error: syntax error ?
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_type 显然这很麻烦很多,或者我必须打开Account在任何代码段的开头,其中 account_type被使用,这意味着我会牺牲我通过使用 Account 的签名来获得的抽象。
我浏览了几个 OCaml 教程以及 INRIA 文档,但我找不到任何关于你如何做到这一点的提及。
是否可以避免每次我想使用 account_type 时都必须打开模块? ?

提前致谢,

扎克

最佳答案

在第二个示例中,您实际上不必 open Account语法就是 `Current 100.0 .多态变体标签不参与任何特定类型。 `Current的类型是 [> `Current ] , 这 (> ) 表示类型至少为 `Current ,并且由于这是函数接受的类型的子集,因此它可以编译得很好。您可以将相同的值传递给许多接受同名多态变体的函数。当然,缺少静态类型信息,键入错误和情况会变得相当复杂。

Code Reuse through polymorphic variants谈论它们的一些优点和用例。

关于types - 在定义它们的模块之外使用开放联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7918438/

相关文章:

arrays - 不能在赋值 : need type assertion 中使用字(类型接口(interface) {})作为类型字符串

go - 非导出类型的类型断言

在 Emacs 下运行的 OCaml 顶层输入数据

c# - 如何将带有 VARIANT 的 C++ 方法转换为没有 VARIANT 的 C#?

c++ - 是否可以在没有 lambdas 的情况下使用 std::visit (只是一个简单的类)?

types - Julia 函数类型注解

c++ - 使用模板时的类型推断

html - 使用 OCaml 解析 HTML

ocaml - OPAM软件包未运行

c++ - 运算符|| std::variant 的重载