birleşme sorununa Tipi çıkarsama

oy
2

Herkes bir fikir var nasıl tür kesmesi sorunu

E > hd (cons 1 nil) : α0

yazarak çevre ile

                E={
                   hd : list(α1 ) → α1 ,
                   cons : α2 → list(α2 ) → list(α2 ),
                   nil : list(α3 ),
                   1 : int
                }

Bir birleşme sorunu aktarılabilir?

Herhangi bir yardım gerçekten takdir!

Oluştur 09/12/2008 saat 14:58
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
3

senin ifadede değişkenlerin hiçbiri yazarak ortamında değişkenleri ile çarpışır ve böylece Birincisi, tip değişkenleri yeniden adlandırın. (Sizin örnekte, bu zaten ifade referanslar {a0} beri yapılıyorsa ve yazarak çevre referansları {a1, a2, a3}.

İkincisi, yeni tip değişkenleri kullanarak, böyle bir şey üreten senin ifadesi içindeki her alt ifade için tip değişkeni olun:

nil : a4
1 : a5
cons : a6
(cons 1 nil) : a7
hd : a8
hd (cons 1 nil) : a0 // already had a type variable

Üçüncüsü, tutmak gerekir tip değişkenler arasındaki denklem kümesi oluşturur. Sen yukarıdan aşağı veya başka yollarla, aşağıdan yukarıya doğru yapabilirsiniz. Bkz Heeren, Bastiaan. Üst Kalite Tipi Hata Mesajları. 2005. Eğer öyle ya da seçmek isteyebilirsiniz neden kapsamlı detaylar için. Bu gibi bir şey neden olacaktır:

a4 = list(a3) // = E(nil)
a5 = int // = E(1)
a6 = a2 -> list(a2) -> list(a2) // = E(cons)

// now it gets tricky, since we need to deal with application for the first time
a5 = a2 // first actual param of cons matches first formal param of cons
a4 = list(a2) // second actual param of cons matches type of second formal param of cons
a7 = list(a2) // result of (cons 1 nil) matches result type of cons with 2 params

a8 = list(a1) -> a1 // = E(hd)    

// now the application of hd
a7 = list(a1) // first actual param of hd matches type of first formal param of hd
a0 = a1 // result of hd (cons 1 nil) matches result type of hd with 1 param

Aynı işlevi iki defa tip ortamdan kullanıldıysa ile birleştirmeye eksileri aynı tip kullanım için yanlışlıkla tüm çağrıları yapmak olmaz ki, biz, (yukarıda, ikinci adımda) daha yeni tip değişkenleri ihtiyacı olduğu dikkatlice Not . Özür, daha açık bir şekilde bu bölümü açıklamak nasıl emin değilim. hd ve aleyhte her biri sadece bir kez kullanıldığından Burada kolay durumda bulunmaktadır.

Dördüncü olarak, gibi (bir hata yapmış bırakmadılarsa) şeye sonuçlanan bu denklemleri birleştirmek:

a4 = list(int)
a5 = int
a6 = int -> list(int) -> list(int)
a7 = list(int)
a8 = list(int) -> int
a0 = int

artık orijinal ifadede her alt ifadenin türünü bilmek, Sevin.

(Adil uyarı, kendimi bu konularda bir amatörün biraz değilim, ben de bir yazım hatası yapmış veya sehven buralarda bir yerde hile olabilir.)

Cevap 19/12/2008 saat 21:33
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more