Perbedaan utama ada di sepanjang dua dimensi - dalam teori yang mendasarinya, dan bagaimana mereka dapat digunakan. Mari kita fokus pada yang terakhir.
Sebagai pengguna, "logika" spesifikasi di LiquidHaskell dan sistem penyempurnaan umumnya, dibatasi untuk fragmen yang dapat diurai sehingga verifikasi (dan inferensi) sepenuhnya otomatis, artinya seseorang tidak memerlukan "syarat bukti" dari jenis yang diperlukan secara penuh. pengaturan tergantung. Ini mengarah pada otomatisasi yang signifikan. Misalnya, bandingkan jenis penyisipan di LH:
http://ucsd-progsys.github.io/lh-workshop/04-case-study-insertsort.html#/ordered-lists
vs. di Idris
https://github.com/davidfstr/idris-insertion-sort/blob/master/InsertionSort.idr
Namun, otomasi harganya mahal. Seseorang tidak dapat menggunakan fungsi sewenang-wenang sebagai spesifikasi seperti yang dapat dilakukan di dunia yang sepenuhnya tergantung, yang membatasi kelas properti yang dapat ditulis.
Dengan demikian, salah satu tujuan dari sistem penyempurnaan adalah untuk memperluas kelas dari apa yang dapat ditentukan, sedangkan tujuan dari sistem yang sepenuhnya tergantung adalah untuk mengotomatisasi
apa yang dapat dibuktikan. Mungkin ada tempat pertemuan yang menyenangkan di mana kita bisa mendapatkan yang terbaik dari kedua dunia!
Jenis perbaikan adalah jenis yang biasa dengan predikat. Yaitu, mengingat bahwa adalah tipe yang biasa dan adalah beberapa predikat padaT P T
AFAIK, dalam Liquid Haskell, mereka juga memungkinkan beberapa tipe fungsi dependend , yaitu tipe [1]. Perhatikan bahwa tipe yang sepenuhnya tergantung (seperti tipe sigma) tidak diizinkan.{x:T1→T2∣P}
Sistem Jenis Cairan, yang dijelaskan dalam [1] memang dapat dipilih dan Cairan Haskell memang menggunakan pemecah SMT. Namun, Liquid Haskell juga membutuhkan istilah bukti (atau nilai-nilai, seperti yang disebut dalam bahasa yang diketik tidak tergantung): jika Anda duduk untuk menulis program Liquid Haskell, Anda menulis fungsi Anda sendiri, bukan hanya jenis.
[1] http://goto.ucsd.edu/~rjhala/liquid/liquid_types.pdf
sumber
Tipe dependen adalah tipe yang bergantung pada nilai dengan cara apa pun. Contoh klasik adalah "jenis vektor panjang
n
", di manan
nilainya. Jenis perbaikan, seperti yang Anda katakan dalam pertanyaan, terdiri dari semua nilai dari jenis tertentu yang memenuhi predikat tertentu. Misalnya jenis angka positif. Konsep-konsep ini tidak terlalu terkait (yang saya tahu). Tentu saja, Anda juga dapat memiliki jenis penyempitan yang cukup beralasan, seperti "jenis semua angka yang lebih besar darin
".sumber
0
"?