Types ocaml记录类型和null

Types ocaml记录类型和null,types,ocaml,record,Types,Ocaml,Record,我试图定义类型,如: 类型aaa=NULL |{a:int;b:int} 但是编译器不允许这样做。我不知道为什么我们不能把唱片类型和其他类型混合在一起 我需要匹配一个值,如果它是记录类型或空记录,并且我已经厌倦了创建像{a=-999;b=-999}这样的伪记录 有更好的方法吗?定义的“记录”部分必须以单独的类型完成。然后,如果要表示“无”或“某个值”,可以将其包装为“option”类型 第一个问题:在Objective Caml方法中,没有构造函数就不能有干净的联合类型。考虑下面的难题: typ

我试图定义类型,如:

类型aaa=NULL |{a:int;b:int}

但是编译器不允许这样做。我不知道为什么我们不能把唱片类型和其他类型混合在一起

我需要匹配一个值,如果它是记录类型或空记录,并且我已经厌倦了创建像{a=-999;b=-999}这样的伪记录

有更好的方法吗?

定义的“记录”部分必须以单独的类型完成。然后,如果要表示“无”或“某个值”,可以将其包装为“option”类型


第一个问题:在Objective Caml方法中,没有构造函数就不能有干净的联合类型。考虑下面的难题:

type test = Null | {a : int ; b: int }

let value = { a: 0 ; b : 42 } in print_int value.a
第二行不正确,因为
value
是联合类型,因此可能是
Null
,它没有成员
a
。这将引入一个关于联合类型值的隐式假设,这是客观Caml不惜一切代价避免的。这意味着您需要一个构造函数

但即使这样也足够了,因为这样您将拥有一个匿名记录类型:

type test = Null | Pair of { a : int ; b : int }

match Pair { a : 0 ; b : 42 } with
  | Null -> 0
  | Pair p -> p.a
这里的
p
是什么类型?这当然可以通过允许匿名记录类型进入该语言来解决,但这不是一个简单的添加,因为众所周知,使用类型统一方法很难处理此类类型,并且需要大量额外的构造来支持(例如,用于处理对象的
<;…>
#type
值:>type
构造)

语言设计者采取了简单的方法,要求所有记录类型都有一个名称。当然,如果记录非常简单,可以使用元组:

type test = Null | Pair of int * int

回答得很好,统一真的是一件令人头痛的事,我还不能了解它背后的全部情况,但从OCaml版本4.03开始,就支持“内联记录”。请参阅和。
type test = Null | Pair of int * int