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.
Jawaban:
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.
bushdisebut GADT. Saya telah melihat mereka disebut tipe bersarang atau tidak biasa.
bush a? Dalam contoh ini, apakah itu Nest Leaf(a) Leaf(a) Leaf(a) Leaf(a), atau Nest ((Nest Leaf(a) Leaf(a)) (Nest Leaf(a) Leaf(a)))sebagai salah satu contoh set?
Pertimbangkan tipe data aljabar seperti:
data List a = Nil | Cons a (List a)
Jenis pengembalian setiap konstruktor dalam tipe data semuanya sama: Nildan Conskeduanya kembali List a. Jika kami mengizinkan konstruktor untuk mengembalikan jenis yang berbeda, kami memiliki GADT :
data Empty -- this is an empty data declaration; Empty has no constructors
data NonEmpty
data NullableList a t where
Vacant :: NullableList a Empty
Occupied :: a -> NullableList a b -> NullableList a NonEmpty
Occupiedmemiliki tipe a -> NullableList a b -> NullableList a NonEmpty, sementara Consmemiliki tipe a -> List a -> List a. Penting untuk dicatat bahwa itu NonEmptyadalah tipe, bukan istilah. Contoh lain:
data Zero
data Succ n
data SizedList a t where
Alone :: SizedList a Zero
WithFriends :: a -> SizedList a n -> SizedList a (Succ n)
Tipe induktif dalam bahasa pemrograman yang memiliki tipe dependen memungkinkan tipe kembalinya konstruktor bergantung pada nilai (bukan hanya tipe) dari argumen.
Inductive Parity := Even | Odd.
Definition flipParity (x:Parity) : Parity :=
match x with
| Even => Odd
| Odd => Even
end.
Fixpoint getParity (x:nat) : Parity :=
match x with
| 0 => Even
| S n => flipParity (getParity n)
end.
(*
A ParityNatList (Some P) is a list in which each member
is a natural number with parity P.
*)
Inductive ParityNatList : option Parity -> Type :=
Nil : forall P, ParityNatList P
| Cons : forall (x:nat) (P:option Parity),
ParityNatList P -> ParityNatList
(match P, getParity x with
| Some Even, Even => Some Even
| Some Odd, Odd => Some Odd
| _, _ => None
end).
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.