我试图定义类型:ocaml记录类型和null
type aaa = NULL | {a:int; b:int} ;;
但编译器不允许这样做。我不确定为什么我们不能将记录类型与其他任何东西混合。
我需要匹配一个值,如果它是记录类型或空记录,我厌倦了创建像{a = -999; b = -999}。
有没有更好的方法?
我试图定义类型:ocaml记录类型和null
type aaa = NULL | {a:int; b:int} ;;
但编译器不允许这样做。我不确定为什么我们不能将记录类型与其他任何东西混合。
我需要匹配一个值,如果它是记录类型或空记录,我厌倦了创建像{a = -999; b = -999}。
有没有更好的方法?
定义的“记录”部分必须以单独的类型完成。然后,如果要表达“无”或“某些值”,则可以将其包装在“选项”类型中。
type aaa = {a: int; b: int}
type bbb = aaa option
第一个问题:在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
这里的类型?这当然可以通过将匿名记录类型应用到语言中来解决,但这不是一个简单的补充,因为这类类型通常很难用类型统一方法处理,并且需要大量额外的支持结构(例如,< ; ... >
, #type
和value :> type
构造用于处理对象)。
语言设计师采取了简单的方法,并要求所有记录类型都接收一个名称。当然,如果你有一个非常简单的记录,你可以使用一个元组:
type test = Null | Pair of int * int
辉煌的答案,统一很是头疼,我不能得到它背后的全貌尚未 – 0xFF 2010-01-04 22:22:13