К сожалению, большая часть литературы по этой теме очень плотная. Я тоже был на твоем месте. Впервые я познакомился с предметом из книги «Языки программирования: приложения и интерпретация».
http://www.plai.org/
Я попытаюсь резюмировать абстрактную идею, сопровождаемую деталями, которые я не сразу нашел очевидными. Во-первых, вывод типа можно рассматривать как создание, а затем решение ограничений. Чтобы сгенерировать ограничения, вы рекурсивно просматриваете синтаксическое дерево и генерируете одно или несколько ограничений для каждого узла. Например, если узел является +
оператором, все операнды и результаты должны быть числами. Узел, который применяет функцию, имеет тот же тип, что и результат функции, и так далее.
Для языка без него let
вы можете вслепую решить указанные выше ограничения с помощью замены. Например:
(if (= 1 2)
1
2)
здесь, можно сказать , что условие , если заявление должно быть Boolean, и тип , если заявление является такой же , как тип ее then
и else
статей. Поскольку мы знаем числа 1
и 2
являются числами, путем подстановки мы узнаем, что if
утверждение является числом.
Там, где все становится неприятно и что я какое-то время не мог понять, имеет дело с let:
(let ((id (lambda (x) x)))
(id id))
Здесь мы связались id
с функцией, которая возвращает все, что вы передали, иначе известную как функция идентификации. Проблема в том, что тип параметра функции x
различается при каждом использовании id
. Второй id
- это функция типа a -> a
, где a
может быть что угодно. Первый тип (a -> a) -> (a -> a)
. Это известно как let-полиморфизм. Ключ в том, чтобы решать ограничения в определенном порядке: сначала решите ограничения для определения id
. Это будет a -> a
. Затем свежие, отдельные копии типа id
могут быть подставлены в ограничения для каждого id
используемого места, например, a2 -> a2
и a3 -> a3
.
Это было нелегко объяснить в онлайн-ресурсах. Они будут упоминать алгоритм W или M, но не упомянут, как они работают с точки зрения решения ограничений, или почему он не препятствует let-полиморфизму: каждый из этих алгоритмов обеспечивает упорядочение решения ограничений.
Я нашел этот ресурс чрезвычайно полезным, чтобы связать алгоритмы W, M и общую концепцию создания и решения ограничений. Немного густо, но лучше многих:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Есть и многие другие статьи:
http://people.cs.uu.nl/bastiaan/papers.html
Я надеюсь, что это поможет прояснить несколько темный мир.