types - OCaml 在不相交的联合中有记录语法吗?

标签 types ocaml record algebraic-data-types

我可以像这样编写标准的不相交联合:

type test = A of int * int | B of int * int;;

然而,随着类型变得越来越复杂,访问特定字段或跟踪每个字段代表的内容变得越来越痛苦。 Haskell 用 record syntax 解决了这个问题.也就是说,能够执行以下操作会很好:

type test = A of {x:int * y:int} | B of {x:int * y:int};;

我不容易找到这样的东西,但 OCaml 文档总体上看起来有点参差不齐,所以它很可能存在。有什么建议吗?

编辑:我知道不相交的联合和记录语法,我只是希望在组合它们时有好的语法。

最佳答案

不幸的是,您不能将记录字段放在变体构造函数声明的参数中。您必须单独定义它:

type xy = { x : int; y : int }
type test = A of xy | B of xy

这会稍微降低内存效率,因为您需要另一个内存块用于 xy。如果通过记录大大提高可读性,我个人并不介意。

但是,我记得有一个提案和一个补丁,就像您写的那样,将记录字段作为变体构造函数:

type test = A of { x : int; y : int } | B of { x : int; y : int }

不需要额外的 block 。但它不在 OCaml 4.01.0 中,我不确定在未来的 OCaml 版本中是否可以使用此扩展。欢迎进一步评论。

关于types - OCaml 在不相交的联合中有记录语法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22367396/

相关文章:

types - 如何在 z3 中定义 Int 排序(SMT-LIB 2.0 Ints 理论)和动态声明的排序?

variables - 无法在 Kotlin 中打印多个 bool 值

image-processing - 告诉 Mathematica 函数不要更改参数的 DataType

c# - 在 Windows 上将声音录制为 C# 程序的一部分

c# - 跳转到c#中的数据库记录

java - 令人困惑的代码,编译正常。这段代码是如何工作的?

ocaml - 没有为以下模块提供实现 : Str

printing - OCaml:用括号括起来的代码

Char 与 int 调用约定

php - 防止 Doctrine 记录被删除的正确方法