Saya sedang mengerjakan bahasa berbasis ekspresi dari silsilah ML, jadi tentu saja perlu inferensi jenis> :)
Sekarang, saya mencoba untuk memperluas solusi berbasis kendala untuk masalah tipe menyimpulkan, berdasarkan pada implementasi sederhana dalam EOPL (Friedman dan Wand), tetapi mereka secara elegan memihak tipe data aljabar.
Apa yang saya miliki sejauh ini bekerja dengan lancar; jika ekspresi e
adalah a + b
, e : Int
, a : Int
dan b : Int
. Jika e
cocok,
match n with
| 0 -> 1
| n' -> n' * fac(n - 1)`,
Saya benar dapat menyimpulkan bahwa t(e) = t(the whole match expression)
, t(n) = t(0) = t(n')
, t(match) = t(1) = t(n' * fac(n - 1)
dan seterusnya ...
Tapi saya sangat tidak yakin ketika datang ke tipe data aljabar. Misalkan fungsi seperti filter:
let filter pred list =
match list with
| Empty -> Empty
| Cons(e, ls') when pred e -> Cons (e, filter ls')
| Cons(_, ls') -> filter
Agar tipe daftar tetap polimorfik, Kontra harus bertipe a * a list -> a list
. Jadi, dalam menetapkan batasan-batasan ini, saya jelas perlu mencari jenis-jenis konstruktor aljabar saya ini - masalah yang saya miliki sekarang adalah 'sensitivitas konteks' dari banyak penggunaan konstruktor aljabar - bagaimana saya mengekspresikan dalam persamaan kendala saya bahwa a
dalam setiap kasus harus sama?
Saya mengalami kesulitan menemukan solusi umum untuk ini, dan saya tidak dapat menemukan banyak literatur tentang ini. Setiap kali saya menemukan sesuatu yang serupa - bahasa berbasis ekspresi dengan inferensi tipe berbasis kendala - mereka berhenti hanya pada tipe data aljabar dan polimorfisme.
Masukan apa pun sangat dihargai!