2009-12-20 192 views
9

在OCaml的語言規範,有短款:什麼是ocaml類型'a。 'a - >'是什麼意思?

poly-typexpr ::= typexpr 
       | { ' ident }+ . typexpr 

有沒有在文本沒有解釋,並poly-typexpr的唯一實例是定義一個方法類型:

method-type ::= method-name : poly-typexpr 

這說明什麼允許我做什麼?

回答

12

poly-typexpr也可以作爲記錄字段的類型(請參見Section 6.8.1)。這些通常被稱爲「存在類型」,儘管存在some debate on that point。以這種方式使用多態類型可以改變類型變量的範圍。例如,比較類型:

type 'a t = { f : 'a -> int; } 
type u = { g : 'a. 'a -> int; } 

t確實是一個類型的家庭,一個爲'a每個可能值。 'a t類型的每個值必須具有f的字段'a -> int。例如:

# let x = { f = fun i -> i+1; } ;; 
val x : int t = {f = <fun>} 
# let y = { f = String.length; } ;; 
val y : string t = {f = <fun>} 

比較而言,u是單一類型。 u類型的每個值都必須有一個字段g,其類型爲'a -> int,對於任意'a。例如:

# let z = { g = fun _ -> 0; } ;; 
val z : u = {g = <fun>} 

請注意,g根本不依賴於其輸入的類型;如果是這樣,它不會有類型'a. 'a -> int。例如:

# let x2 = { g = fun i -> i+1; } ;; 
This field value has type int -> int which is less general than 'a. 'a -> int