Konuyla ilgili literatürün çoğunun çok yoğun olması talihsiz bir durum. Ben de senin yerindeydim. Konuya ilk girişimi Programlama Dilleri: Uygulamalar ve Yorumlama bölümünden aldım.
http://www.plai.org/
Soyut fikri ve hemen açık bulamadığım detayları özetlemeye çalışacağım. İlk olarak, tür çıkarımı, kısıtları oluşturmak ve sonra bunları çözmek olarak düşünülebilir. Kısıtlamalar oluşturmak için sözdizimi ağacında yinelenir ve her düğümde bir veya daha fazla kısıtlama oluşturursunuz. Örneğin, düğüm bir +operatör ise, işlenenler ve sonuçların tümü sayı olmalıdır. Bir işlevi uygulayan bir düğüm, işlevin sonucu ile aynı türe sahiptir ve bu böyle devam eder.
Olmayan bir dil için let, yukarıdaki kısıtlamaları değiştirerek körü körüne çözebilirsiniz. Örneğin:
(if (= 1 2)
1
2)
burada, if ifadesinin koşulunun Boolean olması gerektiğini ve if ifadesinin türünün, thenve elsecümlelerinin türüyle aynı olduğunu söyleyebiliriz . Bildiğimiz 1ve 2sayı olduğumuz için, ikame ile, ififadenin bir sayı olduğunu biliyoruz .
İşlerin çirkinleştiği ve bir süredir anlayamadığım şey, let'le uğraşmaktır:
(let ((id (lambda (x) x)))
(id id))
Burada, idilettiğiniz her şeyi döndüren, aksi takdirde kimlik işlevi olarak bilinen bir işleve bağlıyız. Sorun, işlevin parametresinin türünün xher kullanımda farklı olmasıdır id. İkinci idtip bir fonksiyonudur a -> a, aher şey olabilir. İlki tiptedir (a -> a) -> (a -> a). Bu, let-polimorfizmi olarak bilinir. Anahtar, kısıtlamaları belirli bir sırayla çözmektir: önce tanım için kısıtlamaları çözün id. Bu olacak a -> a. Daha sonra türünün yeni, ayrı kopyaları, idher yer için kısıtlamalara dönüştürülebilir, idörneğin a2 -> a2ve a3 -> a3.
Bu, çevrimiçi kaynaklarda kolayca açıklanmadı. W veya M algoritmasından bahsedecekler, ancak kısıtları çözme açısından nasıl çalıştıklarından veya let-polimorfizminden neden bahsetmeyeceklerinden bahsedecekler: bu algoritmaların her biri, kısıtlamaları çözmek için bir sıralama zorlar.
Bu kaynağı, W, M Algoritması ve genel kısıt oluşturma ve çözme kavramını birbirine bağlamak için son derece yararlı buldum. Biraz yoğun, ancak çoğundan daha iyi:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Diğer kağıtların çoğu da güzel:
http://people.cs.uu.nl/bastiaan/papers.html
Umarım bu biraz karanlık bir dünyayı aydınlatmaya yardımcı olur.