Di tempat kerja saya ditugaskan untuk menyimpulkan beberapa jenis informasi tentang bahasa yang dinamis. Saya menulis ulang urutan pernyataan menjadi let
ekspresi bersarang , seperti:
return x; Z => x
var x; Z => let x = undefined in Z
x = y; Z => let x = y in Z
if x then T else F; Z => if x then { T; Z } else { F; Z }
Karena saya mulai dari informasi tipe umum dan mencoba menyimpulkan tipe yang lebih spesifik, pilihan alami adalah tipe perbaikan. Sebagai contoh, operator kondisional mengembalikan penyatuan jenis cabang benar dan salahnya. Dalam kasus sederhana, ini bekerja dengan sangat baik.
Namun, saya mengalami hambatan, ketika mencoba menyimpulkan jenis berikut ini:
function g(f) {
var x;
x = f(3);
return f(x);
}
Yang ditulis ulang untuk:
\f.
let x = undefined in
let x = f 3 in
f x
Saya sudah menggunakan dependensi fungsional untuk menyelesaikan tipe +
operator yang kelebihan beban , jadi saya pikir itu adalah pilihan alami untuk menggunakannya untuk menyelesaikan tipe f
dalam g
. Artinya, tipe-tipe f
dalam semua aplikasinya bersama-sama secara unik menentukan tipe g
. Namun, ternyata, fundeps tidak meminjamkan diri mereka dengan sangat baik untuk jumlah variabel jenis sumber.
Pokoknya, saling mempengaruhi polimorfisme dan pengetikan mengetik bermasalah. Jadi, apakah ada pendekatan yang lebih baik yang saya lewatkan? Saat ini saya sedang mencerna "Jenis Perbaikan untuk ML" dan akan lebih menghargai literatur atau petunjuk lainnya.
sumber