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