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