Τύπος συμπέρασμα για την ενοποίηση πρόβλημα

ψήφοι
2

Έχει κανείς μια ιδέα για το πώς το πρόβλημα συμπέρασμα τύπο

E > hd (cons 1 nil) : α0

με το περιβάλλον πληκτρολόγηση

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

μπορούν να μεταφερθούν σε ένα πρόβλημα ενοποίησης;

Οποιαδήποτε βοήθεια θα ήταν πραγματικά εκτιμηθεί!

Δημοσιεύθηκε 09/12/2008 στις 14:58
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
3

Κατ 'αρχάς, μετονομασία μεταβλητών τύπου, έτσι ώστε καμία από τις μεταβλητές στην έκφρασή σας συγκρούονται με τις μεταβλητές στο περιβάλλον πληκτρολόγηση. (Στο παράδειγμα σας, αυτό έχει ήδη γίνει δεδομένου ότι οι αναφορές έκφρασης {a0}, και οι αναφορές δακτυλογράφηση περιβάλλον {a1, a2, a3}.

Δεύτερον, χρησιμοποιώντας νέες μεταβλητές τύπου, κάνουν μια μεταβλητή τύπου για κάθε υποέκφραση κατά την έκφρασή σας, που παράγουν κάτι σαν:

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

Τρίτον, να δημιουργήσει ένα σύνολο εξισώσεων μεταξύ μεταβλητών τύπου που πρέπει να διαθέτουν. Μπορείτε να το κάνετε αυτό από κάτω προς τα πάνω, από πάνω προς τα κάτω, ή με άλλους τρόπους. Δείτε Heeren, Bastiaan. Μηνύματα Τύπος σφάλματος κορυφαία ποιότητα. 2005 για εκτενείς λεπτομέρειες σχετικά με το γιατί μπορεί να θέλετε να επιλέξετε ένα ή τον άλλο τρόπο. Αυτό θα οδηγήσει σε κάτι σαν:

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

Σημειώστε προσεκτικά ότι εάν η ίδια η λειτουργία χρησιμοποιείται από το περιβάλλον του τύπου δύο φορές, θα χρειαστεί περισσότερες νέες μεταβλητές τύπου (το δεύτερο βήμα, παραπάνω) να ενοποιήσει με, έτσι ώστε να μην κατά λάθος κάνει όλες τις κλήσεις προς τα μειονεκτήματα χρησιμοποιούν τον ίδιο τύπο . Δεν είμαι σίγουρος πώς να εξηγήσω αυτό το μέρος με μεγαλύτερη σαφήνεια, συγγνώμη. Εδώ είμαστε στην εύκολη υπόθεση αφού hd και τα μειονεκτήματα κάθε μία χρησιμοποιηθεί μόνο μία φορά.

Τέταρτον, να ενοποιήσει αυτές τις εξισώσεις, με αποτέλεσμα (αν δεν έχω κάνει λάθος) κάτι σαν:

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

Χαίρε, ξέρετε τώρα το είδος της κάθε υπό-έκφρασης στην αρχική σας έκφραση.

(Δίκαιη προειδοποίηση, είμαι κάπως ενός ερασιτέχνη εαυτό μου σε αυτά τα θέματα, και αυτό μπορεί κάλλιστα να γίνει ένα τυπογραφικό λάθος ή ακούσια εξαπατημένοι κάπου εδώ.)

Απαντήθηκε 19/12/2008 στις 21:33
πηγή χρήστη

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