В ocaml спецификации языка существует короткий раздел:
poly-typexpr ::= typexpr
| { ' ident }+ . typexpr
Нет никакого объяснения в тексте и единственного экземпляра poly-typexpr
находится в определении типа метода:
method-type ::= method-name : poly-typexpr
Что это позволяет мне делать?
poly -typexpr
также разрешен как тип поля записи (см. раздел 6.8.1 ). Их обычно называют «экзистенциальными типами», хотя по этому поводу ведутся споры . Использование полиморфного типа таким образом изменяет область видимости переменной типа. Например, сравните типы:
type 'a t = { f : 'a -> int; }
type u = { g : 'a. 'a -> int; }
t
- это действительно семейство типов, по одному на каждое возможное значение 'a
. Каждое значение типа 'в
должно иметь поле 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
для any ' 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
См. раздел 3.11 «Полиморфные методы» . Прокрутите вниз до «Конечно, ограничение также может быть явным типом метода ...»