在OCaml的語言規範,有短款:什麼是ocaml類型'a。 'a - >'是什麼意思?
poly-typexpr ::= typexpr
| { ' ident }+ . typexpr
有沒有在文本沒有解釋,並poly-typexpr
的唯一實例是定義一個方法類型:
method-type ::= method-name : poly-typexpr
這說明什麼允許我做什麼?
在OCaml的語言規範,有短款:什麼是ocaml類型'a。 'a - >'是什麼意思?
poly-typexpr ::= typexpr
| { ' ident }+ . typexpr
有沒有在文本沒有解釋,並poly-typexpr
的唯一實例是定義一個方法類型:
method-type ::= method-name : poly-typexpr
這說明什麼允許我做什麼?
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
參見section 3.11 "Polymorphic methods"。向下滾動到「當然約束也可以是明確的方法類型...」