Thật không may là phần lớn tài liệu về chủ đề này rất dày đặc. Tôi cũng ở trong vị trí của bạn. Tôi được giới thiệu đầu tiên về chủ đề này từ Ngôn ngữ lập trình: Ứng dụng và Phiên dịch
http://www.plai.org/
Tôi sẽ cố gắng tóm tắt ý tưởng trừu tượng sau đó là các chi tiết mà tôi không thấy rõ ràng ngay lập tức. Đầu tiên, kiểu suy luận có thể được coi là tạo ra và sau đó giải quyết các ràng buộc. Để tạo ràng buộc, bạn đệ quy thông qua cây cú pháp và tạo một hoặc nhiều ràng buộc trên mỗi nút. Ví dụ: nếu nút là+
toán tử, các toán hạng và kết quả đều phải là số. Nút áp dụng một hàm có cùng kiểu với kết quả của hàm, v.v.
Đối với một ngôn ngữ không có let
, bạn có thể giải quyết một cách mù quáng các ràng buộc trên bằng cách thay thế. Ví dụ:
(if (= 1 2)
1
2)
ở đây, chúng ta có thể nói rằng điều kiện của câu lệnh if phải là Boolean, và kiểu của câu lệnh if giống với kiểu của nó then
và else
các mệnh đề. Kể từ khi chúng tôi biết 1
và2
là số, bằng cách thay thế, chúng ta biết if
câu lệnh là một số.
Nơi mọi thứ trở nên khó chịu và điều mà tôi không thể hiểu được trong một thời gian, đó là giải quyết:
(let ((id (lambda (x) x)))
(id id))
Ở đây, chúng tôi đã liên kết id
với một hàm trả về bất cứ thứ gì bạn đã truyền vào, hay còn gọi là hàm nhận dạng. Vấn đề là loại tham số của hàm x
là khác nhau trên mỗi cách sử dụng id
. Thứ hai id
là một chức năng của loại a -> a
, nơi a
có thể là bất cứ điều gì. Đầu tiên là loại (a -> a) -> (a -> a)
. Điều này được gọi là đa hình cho. Chìa khóa là giải quyết các ràng buộc theo một thứ tự cụ thể: đầu tiên giải quyết các ràng buộc cho định nghĩa của id
. Đây sẽ là a -> a
. Sau đó, các bản sao mới, riêng biệt của loại id
có thể được thay thế vào các ràng buộc cho từng nơi id
được sử dụng, chẳng hạn a2 -> a2
và a3 -> a3
.
Điều đó không được giải thích dễ dàng trong các nguồn trực tuyến. Họ sẽ đề cập đến thuật toán W hoặc M nhưng không đề cập đến cách chúng hoạt động về mặt giải quyết các ràng buộc, hoặc tại sao nó không ngăn cản tính đa hình của let: mỗi thuật toán đó thực thi một thứ tự để giải quyết các ràng buộc.
Tôi thấy tài nguyên này cực kỳ hữu ích để kết hợp Thuật toán W, M và khái niệm chung về tạo và giải quyết ràng buộc lại với nhau. Nó hơi đặc, nhưng tốt hơn nhiều:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Nhiều giấy tờ khác cũng rất hay:
http://people.cs.uu.nl/bastiaan/papers.html
Tôi hy vọng điều đó sẽ giúp làm sáng tỏ một thế giới có phần âm u.