Ben ML şecere ifade tabanlı bir dil üzerinde çalışıyorum, bu yüzden doğal olarak tür çıkarım gerekiyor :)
Şimdi, EOPL'de (Friedman ve Wand) basit bir uygulamaya dayanan, çıkarım türleri sorununa kısıtlamaya dayalı bir çözüm geliştirmeye çalışıyorum, ancak zarif bir şekilde yan basamak cebirsel veri tipleri.
Şimdiye kadar olanlarım sorunsuz çalışıyor; bir ekspresyon durumunda e
olduğu a + b
, e : Int
, a : Int
ve b : Int
. e
Bir eşleşme varsa ,
match n with
| 0 -> 1
| n' -> n' * fac(n - 1)`,
Ben haklı olduğunu çıkarabiliriz t(e) = t(the whole match expression)
, t(n) = t(0) = t(n')
, t(match) = t(1) = t(n' * fac(n - 1)
vb ...
Ama cebirsel veri türleri söz konusu olduğunda çok emin değilim. Filtre gibi bir işlev olduğunu varsayalım:
let filter pred list =
match list with
| Empty -> Empty
| Cons(e, ls') when pred e -> Cons (e, filter ls')
| Cons(_, ls') -> filter
Liste türünün polimorfik kalması için Eksilerin tür olması gerekir a * a list -> a list
. Yani, bu kısıtlamalar yaratmada, ben açıkçası benim cebirsel kurucular bu tür bakmak gerekir - Şimdi sahip sorun cebirsel inşaatçı çoklu kullanımlarının 'bağlam duyarlılığı' - nasıl benim kısıt denklemlerde ifade emin a
içinde her vaka aynı olmalı?
Buna genel bir çözüm bulmakta zorlanıyorum ve bununla ilgili çok fazla literatür bulamıyorum. Ne zaman benzer bir şey bulduğumda - kısıtlamaya dayalı tür çıkarımlı ifade tabanlı dil - cebirsel veri türleri ve polimorfizmden sadece kısa dururlar.
Herhangi bir girdi çok takdir edilmektedir!