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