Szkoda, że duża część literatury na ten temat jest bardzo bogata. Ja też byłem na twoim miejscu. Pierwsze wprowadzenie do tematu dostałem z Języki programowania: aplikacje i interpretacja
http://www.plai.org/
Spróbuję podsumować abstrakcyjną ideę, a następnie szczegóły, które nie były dla mnie od razu oczywiste. Po pierwsze, można pomyśleć o wnioskowaniu o typie o generowaniu, a następnie rozwiązywaniu ograniczeń. Aby wygenerować ograniczenia, należy powtórzyć drzewo składni i wygenerować jedno lub więcej ograniczeń w każdym węźle. Na przykład, jeśli węzeł jest +operatorem, wszystkie operandy i wyniki muszą być liczbami. Węzeł, który stosuje funkcję, ma ten sam typ co wynik funkcji i tak dalej.
W przypadku języka bez let, możesz ślepo rozwiązać powyższe ograniczenia przez podstawianie. Na przykład:
(if (= 1 2)
1
2)
tutaj możemy powiedzieć, że warunek instrukcji if musi być logiczny, a typ instrukcji if jest taki sam, jak typ jej klauzul theni else. Ponieważ znamy liczby 1i 2jesteśmy liczbami, przez podstawienie wiemy, że ifstwierdzenie jest liczbą.
Tam, gdzie robi się nieprzyjemnie i czego przez chwilę nie mogłem zrozumieć, to niech:
(let ((id (lambda (x) x)))
(id id))
Tutaj mamy powiązanie idz funkcją, która zwraca wszystko, co przekazałeś, inaczej znaną jako funkcja tożsamości. Problem polega na tym, że typ parametru funkcji xjest inny przy każdym użyciu id. Druga idto funkcja typua -> a , gdzie amoże być wszystko. Pierwsza jest typowa (a -> a) -> (a -> a). Jest to znane jako let-polimorfizm. Kluczem jest rozwiązanie więzów w określonej kolejności: najpierw rozwiąż ograniczenia dla definicji id. To będzie a -> a. Następnie świeże, oddzielne kopie typu idmożna podstawić do ograniczeń dla każdego miejsca id, na przykład a2 -> a2i a3 -> a3.
Nie było to łatwo wyjaśnione w zasobach internetowych. Wspomną o algorytmie W lub M, ale nie o tym, jak działają w zakresie rozwiązywania ograniczeń, ani dlaczego nie działa on na polimorfizm let: każdy z tych algorytmów wymusza uporządkowanie rozwiązywania ograniczeń.
Uważam, że ten zasób jest niezwykle pomocny w łączeniu algorytmów W, M i ogólnej koncepcji generowania i rozwiązywania ograniczeń razem. Jest trochę gęsty, ale lepszy niż wiele:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Wiele innych artykułów też jest fajnych:
http://people.cs.uu.nl/bastiaan/papers.html
Mam nadzieję, że pomoże to wyjaśnić nieco mroczny świat.