poly-typexpr
также допускается в качестве типа поля записи (см. Раздел 6.8.1 ). Их обычно называют «экзистенциальными типами», хотя по этому вопросу ведутся . Использование полиморфного типа таким образом изменяет область видимости переменной типа. Например, сравните типы:
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
для 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