2009-12-20 2 views
9

В спецификации языка OCaml, есть короткий раздел:Что такое ocaml type 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 
Смежные вопросы