我正在尝试定义类型:
输入aaa = NULL | {a:int; b:int} ;;
但编译器不允许这样做。我不确定为什么我们不能将记录类型与其他任何东西混合起来。
我需要匹配一个值,如果它是记录类型或空记录,我厌倦了创建虚拟记录,如{a = -999; b = -999}。
有更好的方法吗?
答案 0 :(得分:7)
定义的“记录”部分必须以单独的类型完成。然后,如果要表达“无”或“某些值”,则可以将其包装在“选项”类型中。
type aaa = {a: int; b: int}
type bbb = aaa option
答案 1 :(得分:7)
第一个问题:在Objective Caml方法中,没有构造函数就不能拥有干净的union类型。考虑以下难题:
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
的类型是什么?这肯定可以通过允许匿名记录类型进入语言来解决,但它不是一个简单的添加,因为这种类型很难用类型统一方法来处理并且需要许多额外的构造来支持(例如,{{ 1}},< ; ... >
和#type
构造用于处理对象。)
语言设计师采取了简单的方法,并要求所有记录类型都获得一个名称。当然,如果你有一个非常简单的记录,你可以使用元组:
value :> type