2010-01-04 73 views
3

我试图定义类型:ocaml记录类型和null

type aaa = NULL | {a:int; b:int} ;;

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

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

有没有更好的方法?

回答

7

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

type aaa = {a: int; b: int} 
type bbb = aaa option 
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 
+0

辉煌的答案,统一很是头疼,我不能得到它背后的全貌尚未 – 0xFF 2010-01-04 22:22:13