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 then
i else
. Ponieważ znamy liczby 1
i 2
jesteśmy liczbami, przez podstawienie wiemy, że if
stwierdzenie 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 id
z funkcją, która zwraca wszystko, co przekazałeś, inaczej znaną jako funkcja tożsamości. Problem polega na tym, że typ parametru funkcji x
jest inny przy każdym użyciu id
. Druga id
to funkcja typua -> a
, gdzie a
moż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 id
można podstawić do ograniczeń dla każdego miejsca id
, na przykład a2 -> a2
i 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.