3

我正在尝试定义如下类型:

类型 aaa = NULL | {一个:整数;b: 整数};;

但是编译器不允许这样做。我不确定我们不能将记录类型与其他任何东西混合的原因。

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

有没有更好的办法 ?

4

2 回答 2

7

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

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

let value = { a: 0 ; b : 42 } in print_int value.a

第二行不正确,因为value是联合类型,因此可能是Null,它没有成员a。这将引入一个关于联合类型值的隐含假设,Objective Caml 不惜一切代价避免这种假设。这意味着您需要一个构造函数。

但即使这样也足够了,因为这样你就会有一个匿名记录类型:

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

match Pair { a : 0 ; b : 42 } with
  | Null -> 0
  | Pair p -> p.a

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

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

type test = Null | Pair of int * int
于 2010-01-04T13:17:10.373 回答
7

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

type aaa = {a: int; b: int}
type bbb = aaa option
于 2010-01-04T11:46:15.343 回答