Dalam pencarian saya untuk makalah penelitian tentang sistem tipe untuk bahasa imperatif, saya hanya menemukan solusi untuk bahasa dengan referensi yang bisa berubah tetapi tanpa struktur kontrol imperatif asli seperti operator majemuk, loop atau kondisional.
Jadi tidak jelas bagaimana bahasa imperatif dengan inferensi tipe parsial seperti http://rust-lang.org dapat diimplementasikan.
Makalah tidak menyebutkan jenis parametrized seperti List of a
karena jenis parametrized adalah perpanjangan sepele dari sistem tipe Hindley-Milner - hanya algoritma unifikasi yang harus diperluas, dan sisa inferensi bekerja seperti apa adanya. Namun, tugas tidak dapat ditambahkan secara sepele karena timbul paradoks, sehingga teknik khusus seperti pembatasan nilai ML harus diterapkan.
Bisakah Anda merekomendasikan makalah atau buku apa pun yang menggambarkan sistem jenis untuk bahasa dengan loop imperatif, kondisional, IO dan pernyataan majemuk?
sumber
let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end
. Jadi pada tingkat pertanyaan penelitian, apakah jawaban yang Anda cari "terapkan teknik yang dikembangkan di Caml / SML, termasuk pembatasan nilai"?Jawaban:
Jika Anda mencari referensi fungsional yang rapi untuk inferensi-tipe, saya sedikit mendukung Gundry, McBride, dan McKinna 2010 " Type Inference in Context ", meskipun ini mungkin bukan panduan yang baik untuk implementasi aktual apa pun yang ada .
Saya pikir bagian dari jawabannya adalah bahwa, di luar batasan nilai, sebenarnya tidak ada banyak kesulitan mengadaptasi inferensi tipe Hindley-Milner ke bahasa imperatif: jika Anda mendefinisikan
e1; e2
sebagai gula sintaksis(fn _ => e2) e1
dan didefinisikanwhile e1 do e2
sebagai gula sintaksis untukwhiledo e1 (fn () => e2)
, di manawhiledo
biasa fungsi rekursifmaka semuanya akan berfungsi dengan baik, termasuk inferensi tipe.
Adapun pembatasan nilai menjadi teknik khusus, saya suka cerita berikut; Saya cukup yakin saya mengambilnya dari Karl Crary. Pertimbangkan kode berikut, di mana batasan nilai akan mencegah Anda menulis dalam ML:
Bandingkan dengan kode berikut, yang sama sekali tidak bermasalah:
Kita tahu apa yang dilakukan contoh kedua: ia membuat dua sel ref baru yang mengandung
NONE
, kemudian menempatkanSOME 5
yang pertama (anint option ref
), kemudian menempatkanSOME "Hello"
yang kedua (astring option ref
).x
x
x
Ini menunjukkan bahwa satu perilaku "baik" dari contoh pertama adalah berperilaku dengan cara yang persis sama dengan contoh kedua berperilaku - instantiate tipe-level lambda dua kali berbeda. Pertama kalinya kami instantiate
x
denganint
, yang akan menyebabkanx [int]
mengevaluasi ke sel tahanan referensiNONE
dan kemudianSOME 5
. Kedua kalinya kami instantiatex
denganstring
, yang akan kasusx [string]
untuk mengevaluasi ke ( berbeda! Holding) sel referensiNONE
dan kemudianSOME "Hello"
. Perilaku ini "benar" (tipe-aman), tetapi jelas bukan yang diharapkan oleh seorang programmer, dan inilah mengapa kami memiliki batasan nilai dalam ML, untuk menghindari programmer berurusan dengan jenis perilaku yang tidak terduga ini.sumber
e1; e2
berisi tanda kurung yang tidak cocok dan titik koma (yang seharusnya didefinisikan). Apakah maksud Anda(fn _ => e2) e1
?Tesis PhD Xavier Leroy adalah awal yang baik.
sumber
Saya minta maaf untuk necroanswering pertanyaan saya sendiri, tetapi referensi yang dimaksud adalah
Proposal untuk ML Standar , Milner, 1983
Bagian 6 "Formulir Berasal Standar" mencakup keinginan untuk konstruksi imperatif yang cukup luas. Dan sejauh ini itu adalah referensi paling awal dari transformasi yang sangat jelas ini yang bisa saya temukan.
sumber