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, then
ve else
cümlelerinin türüyle aynı olduğunu söyleyebiliriz . Bildiğimiz 1
ve 2
sayı olduğumuz için, ikame ile, if
ifadenin 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, id
ilettiğ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 x
her kullanımda farklı olmasıdır id
. İkinci id
tip bir fonksiyonudur a -> a
, a
her ş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ı, id
her yer için kısıtlamalara dönüştürülebilir, id
örneğin a2 -> a2
ve 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.