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