Я читаю статью в Википедии о Hindley– Вывод типа Милнера пытается разобраться в этом. Пока что я понял:
- Типы подразделяются на монотипы и политипы.
- Монотипы далее классифицируются как константы типа (например,
int
илиstring
) или как переменные типа (например,α
иβ
). - Константы типа могут быть конкретными типами (например,
int
иstring
) или конструкторами типов (например,Map
иSet
). - Переменные типа (например,
α
иβ
) действуют как заполнители для конкретных типов (например,int
иstring
).
Теперь у меня небольшие трудности с пониманием политипов, но после небольшого изучения Haskell я вот что из этого делаю:
- Сами типы имеют типы. Формально типы типов называются видами (т.е. есть разные виды типов).
- Конкретные типы (например,
int
иstring
) и переменные типа (например,α
иβ
) относятся к типу*
. - Конструкторы типов (например,
Map
иSet
) являются лямбда-абстракциями типов (например,Set
имеет вид* -> *
, аMap
имеет вид* -> * -> *
).
Я не понимаю, что означают квалификаторы. Например, что представляет собой ∀α.σ
? Я не могу понять, и чем больше я читаю следующий абзац, тем больше запутываюсь:
Функция с политипом ∀α.α -> α, напротив, может отображать любое значение того же типа себе, а функция идентификации является значением для этого типа. В качестве другого примера ∀α. (Set α) -> int - это тип функции, отображающей все конечные множества в целые числа. Количество членов - это значение для этого типа. Обратите внимание, что квалификаторы могут появляться только на верхнем уровне, т. Е. Тип ∀α.α -> ∀α.α, например, исключен синтаксисом типов и что монотипы включены в политипах, таким образом, тип имеет общий вид ∀α₁. . . ∀αₙ.τ.