Прикро, що значна частина літератури на цю тему дуже щільна. Я теж був на вашому місці. Я вперше вступив у цю тему з мов програмування: програми та інтерпретація
http://www.plai.org/
Я спробую узагальнити абстрактну ідею з подальшими деталями, які я не знайшов одразу очевидними. По-перше, можна зробити висновок про тип, щоб генерувати, а потім вирішувати обмеження. Щоб створити обмеження, ви переглядаєте дерево синтаксису та генеруєте одне або кілька обмежень на кожному вузлі. Наприклад, якщо вузол є +оператором, операнди та результати повинні бути числами. Вузол, який застосовує функцію, має той самий тип, що і результат функції тощо.
Для мови без цього letви можете наосліп вирішити вищезазначені обмеження шляхом заміни. Наприклад:
(if (= 1 2)
1
2)
тут можна сказати, що умова оператора if має бути булевим, а тип оператора if такий самий, як тип його thenта elseречень. Оскільки ми знаємо 1і 2є числами, підставляючи, ми знаємо, що ifтвердження є числом.
Там, де все стає неприємним, і те, з чим я якийсь час не міг зрозуміти, має справу, нехай:
(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, але не те, як вони працюють з точки зору вирішення обмежень, або чому він не заважає поліморфізму let: кожен із цих алгоритмів забезпечує порядок вирішення обмежень.
Я знайшов цей ресурс надзвичайно корисним, щоб пов’язати алгоритм W, M та загальну концепцію генерації та вирішення обмежень разом. Це трохи щільно, але краще, ніж у багатьох:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Багато інших паперів там теж приємні:
http://people.cs.uu.nl/bastiaan/papers.html
Сподіваюся, це допоможе прояснити дещо каламутний світ.