Mungkin ada yang bisa menjelaskan perbedaan antara:
- Datatypes aljabar (yang saya kenal)
- Datatypes Aljabar Umum (apa yang membuat mereka digeneralisasikan?)
- Jenis Induktif (mis. Coq)
(Terutama tipe induktif.) Terima kasih.
Mungkin ada yang bisa menjelaskan perbedaan antara:
(Terutama tipe induktif.) Terima kasih.
Tipe data aljabar memungkinkan Anda mendefinisikan tipe secara rekursif. Konkretnya, misalkan kita memiliki tipe data
Apa artinya ini adalah bahwa adalah himpunan terkecil dihasilkan oleh N i l dan C o n s operator. Kita dapat memformalkan ini dengan mendefinisikan operator F ( X )
dan kemudian mendefinisikan sebagai
Sebuah umum ADT adalah apa yang kita dapatkan ketika menentukan jenis operator yang secara rekursif. Sebagai contoh, kita dapat mendefinisikan konstruktor tipe berikut:
Tipe ini berarti bahwa elemen adalah tuple dari sebuah s panjang 2 n untuk beberapa n , karena setiap kali kita pergi ke N e s t konstruktor jenis argumen dipasangkan dengan dirinya sendiri. Jadi kita dapat mendefinisikan operator yang ingin kita gunakan sebagai:
Tipe induktif dalam Coq pada dasarnya adalah GADT, di mana indeks operator tipe tidak terbatas pada tipe lain (seperti dalam, misalnya, Haskell), tetapi juga dapat diindeks oleh nilai -nilai teori tipe. Ini memungkinkan Anda memberikan tipe untuk daftar panjang indeks, dan sebagainya.
bush
disebut GADT. Saya telah melihat mereka disebut tipe bersarang atau tidak biasa.bush a
? Dalam contoh ini, apakah ituNest Leaf(a) Leaf(a) Leaf(a) Leaf(a)
, atauNest ((Nest Leaf(a) Leaf(a)) (Nest Leaf(a) Leaf(a)))
sebagai salah satu contoh set?Pertimbangkan tipe data aljabar seperti:
Jenis pengembalian setiap konstruktor dalam tipe data semuanya sama:
Nil
danCons
keduanya kembaliList a
. Jika kami mengizinkan konstruktor untuk mengembalikan jenis yang berbeda, kami memiliki GADT :Occupied
memiliki tipea -> NullableList a b -> NullableList a NonEmpty
, sementaraCons
memiliki tipea -> List a -> List a
. Penting untuk dicatat bahwa ituNonEmpty
adalah tipe, bukan istilah. Contoh lain:Tipe induktif dalam bahasa pemrograman yang memiliki tipe dependen memungkinkan tipe kembalinya konstruktor bergantung pada nilai (bukan hanya tipe) dari argumen.
Catatan tambahan: GHC memiliki mekanisme untuk memperlakukan konstruktor nilai sebagai konstruktor tipe . Ini tidak sama dengan tipe induktif dependen yang dimiliki Coq, tetapi agak mengurangi beban sintaksis GADT, dan ini dapat menyebabkan pesan kesalahan yang lebih baik.
sumber