Что делает ocaml тип 'a'.-> 'среднее?

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

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

Нет никакого объяснения в тексте и единственного экземпляра poly-typexpr находится в определении типа метода:

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

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

10
задан Thelema 20 December 2009 в 18:23
поделиться

2 ответа

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
14
ответ дан 3 December 2019 в 22:37
поделиться

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

1
ответ дан 3 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: