Sangat disayangkan banyak literatur tentang masalah ini sangat padat. Saya juga berada di posisi Anda. Saya mendapatkan pengantar pertama saya untuk subjek dari Bahasa Pemrograman: Aplikasi dan Interpretasi
http://www.plai.org/
Saya akan mencoba meringkas ide abstrak diikuti dengan detail yang tidak langsung saya temukan dengan jelas. Pertama, jenis inferensi dapat dianggap menghasilkan dan kemudian memecahkan kendala. Untuk menghasilkan batasan, Anda mengulang melalui pohon sintaks dan menghasilkan satu atau lebih batasan pada setiap node. Misalnya, jika node adalah +
operator, operan dan hasilnya harus berupa angka. Node yang menerapkan suatu fungsi memiliki tipe yang sama dengan hasil dari fungsi tersebut, dan seterusnya.
Untuk bahasa tanpa let
, Anda dapat menyelesaikan kendala di atas secara membabi buta dengan substitusi. Sebagai contoh:
(if (= 1 2)
1
2)
di sini, kita dapat mengatakan bahwa kondisi pernyataan jika harus Boolean, dan bahwa jenis pernyataan jika adalah sama dengan jenis yang then
dan else
klausa. Karena kita tahu 1
dan 2
adalah angka, dengan substitusi, kita tahu if
pernyataannya adalah angka.
Di mana hal-hal menjadi buruk, dan apa yang saya tidak bisa mengerti untuk sementara waktu, berurusan dengan biarkan:
(let ((id (lambda (x) x)))
(id id))
Di sini, kita telah terikat id
ke sebuah fungsi yang mengembalikan apa pun yang telah Anda teruskan, atau dikenal sebagai fungsi identitas. Masalahnya adalah jenis parameter fungsi x
berbeda pada setiap penggunaan id
. Yang kedua id
adalah fungsi tipe a -> a
, di mana a
bisa menjadi apa saja. Yang pertama adalah tipe (a -> a) -> (a -> a)
. Ini dikenal sebagai let-polymorphism. Kuncinya adalah memecahkan kendala dalam urutan tertentu: pertama-tama selesaikan kendala untuk definisi id
. Ini akan menjadi a -> a
. Kemudian baru, salinan terpisah dari jenis id
dapat diganti menjadi batasan untuk setiap tempat id
digunakan, misalnya a2 -> a2
dan a3 -> a3
.
Itu tidak mudah dijelaskan dalam sumber daya online. Mereka akan menyebutkan algoritma W atau M tetapi tidak bagaimana mereka bekerja dalam hal memecahkan kendala, atau mengapa tidak muncul pada let-polimorfisme: masing-masing algoritma tersebut memberlakukan urutan untuk memecahkan kendala.
Saya menemukan sumber daya ini sangat membantu untuk mengikat Algoritma W, M, dan konsep umum pembuatan kendala dan menyelesaikan semuanya bersama-sama. Ini sedikit padat, tapi lebih baik dari banyak:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Banyak makalah lain di sana juga bagus:
http://people.cs.uu.nl/bastiaan/papers.html
Saya harap itu membantu menjelaskan dunia yang agak suram.