Прикро, що значна частина літератури на цю тему дуже щільна. Я теж був на вашому місці. Я вперше вступив у цю тему з мов програмування: програми та інтерпретація
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
Сподіваюся, це допоможе прояснити дещо каламутний світ.