我可以像这样编写标准的不相交联合:
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/