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

Types OCaml在不相交的联合中有记录语法吗?,types,ocaml,record,algebraic-data-types,Types,Ocaml,Record,Algebraic Data Types,我可以这样编写标准的不相交并集: type test = A of int * int | B of int * int;; 然而,随着类型变得越来越复杂,访问特定字段或跟踪每个字段所代表的内容变得越来越痛苦。哈斯凯尔用计算机解决了这个问题。也就是说,能够做一些事情会很好,比如: type test = A of {x:int * y:int} | B of {x:int * y:int};; 我不容易找到这样的东西,但是OCaml文档总体上看起来有点不稳定,所以它很可能存在。有什么建议吗

我可以这样编写标准的不相交并集:

type test = A of int * int | B of int * int;;
然而,随着类型变得越来越复杂,访问特定字段或跟踪每个字段所代表的内容变得越来越痛苦。哈斯凯尔用计算机解决了这个问题。也就是说,能够做一些事情会很好,比如:

type test = A of {x:int * y:int} | B of {x:int * y:int};;
我不容易找到这样的东西,但是OCaml文档总体上看起来有点不稳定,所以它很可能存在。有什么建议吗


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

OCaml有记录类型。您可以在OCaml手册的第二部分中阅读有关它们的内容

# type myrec = { a: int; b: string };;
type myrec = { a : int; b : string; }
# let z = { a = 44; b = "yes" };;
val z : myrec = {a = 44; b = "yes"}
# z.a + 14;;
- : int = 58
# type test = A of myrec | B of myrec;
type test = A of myrec | B of myrec

这可能比您要求的要麻烦一些。

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

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 }

它不需要额外的块。但是它不在OCAML4.01.0中,我也不确定这个扩展在未来的OCaml版本中是否可用。欢迎进一步评论。

我知道记录类型和不相交的并集,我只是希望有更好的Haskell式语法。特别是如果每个不相交的类型都有不同的关联记录,则语法会变得有点臃肿。如果这是OCaml中最好的方法……Alain Frisch刚刚建议将此构造添加到OCaml:。