Что означает ocaml? '->' среднее? - PullRequest
9 голосов
/ 20 декабря 2009

В спецификации языка ocaml есть короткий раздел:

poly-typexpr ::= typexpr
               | { ' ident }+ . typexpr

В тексте нет объяснений, и единственный экземпляр poly-typexpr - определение типа метода:

method-type ::= method-name : poly-typexpr

Что это позволяет мне делать?

Ответы [ 2 ]

12 голосов
/ 20 декабря 2009

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
1 голос
/ 20 декабря 2009

См. раздел 3.11 «Полиморфные методы» . Прокрутите вниз до «Конечно, ограничение также может быть явным типом метода ...»

...