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!
Jawaban:
Lihat: Mini ML Khususnya bagian Jenis Inferensi.
Ini berisi kode sampel dalam F # untuk parser lengkap bahasa fungsional sederhana. Lebih penting lagi, bagian Type Inference mengimplementasikan algoritma Hindley-Milner yang merupakan apa yang ditemukan dalam kebanyakan sistem inferensi tipe. Penulis juga menyediakan tautan ke dua dokumen penting lainnya untuk membantu memahami Hindley-Milner; satu menjadi semacam pengantar tingkat tinggi dan lainnya menjadi makalah yang menjelaskan implementasi algoritma dalam kode.
sumber