OCaml是否在不相交的联合中具有记录语法?

akr*_*roy 2 ocaml types record algebraic-data-types

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

type test = A of int * int | B of int * int;;
Run Code Online (Sandbox Code Playgroud)

但是,随着类型变得越来越复杂,访问特定字段或跟踪每个字段所代表的内容变得越来越痛苦.Haskell使用记录语法解决了这个问题.也就是说,能够做到这样的事情会很高兴:

type test = A of {x:int * y:int} | B of {x:int * y:int};;
Run Code Online (Sandbox Code Playgroud)

我不能轻易找到这样的东西,但OCaml文档似乎总体来说有点不稳定,所以它可能存在.有什么建议?

编辑:我知道两个不相交的联合和记录语法,我只是希望结合它们的语法很好.

cam*_*ter 7

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

type xy = { x : int; y : int }
type test = A of xy | B of xy
Run Code Online (Sandbox Code Playgroud)

由于您需要另一个内存块,因此内存效率稍低xy.就个人而言,如果记录能够大大提高可读性,我不介意.

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

type test = A of { x : int; y : int } | B of { x : int; y : int }
Run Code Online (Sandbox Code Playgroud)

这不需要额外的块.但它不在OCaml 4.01.0中,我不确定在未来的OCaml版本中是否有可能提供此扩展.欢迎进一步评论.