Herhangi biri arasındaki farkı açıklayabilir:
- Cebirsel Veri Tipleri (oldukça aşina olduğum)
- Genelleştirilmiş Cebirsel Veri Tipleri (onları genelleştiren nedir?)
- Endüktif Tipler (örneğin, Coq)
(Özellikle endüktif tipler.) Teşekkürler.
Herhangi biri arasındaki farkı açıklayabilir:
(Özellikle endüktif tipler.) Teşekkürler.
Yanıtlar:
Cebirsel veri türleri, türleri özyinelemeli olarak tanımlamanıza izin verir. Somut, veri tipine sahip olduğumuzu varsayalım
Bunun anlamı ise tarafından üretilen küçük dizi , N i l ve C O n s operatörler. Bunu F ( X ) operatörünü tanımlayarak resmileştirebiliriz.
ve daha sonra tanımlama olarak
Bir genelleştirilmiş ADT türü tanımlarken ne olsun operatörü yinelemeli. Örneğin, aşağıdaki tür kurucuyu tanımlayabiliriz:
Bu tür aracının bir unsuru bir demet olan bir uzunlukta s 2 , n bazıları için n parametre olarak her zaman için, N , e s t yapıcı tür bağımsız değişkeni kendisi ile eşleştirilir. Böylece sabit bir nokta almak istediğimiz operatörü tanımlayabiliriz:
Coq'daki bir endüktif tip, esas olarak, tip operatörünün indekslerinin diğer tiplerle (örneğin Haskell'de olduğu gibi) sınırlı olmadığı, ancak tip teorisinin değerleriyle endekslenebildiği bir GADT'dir . Bu, uzunluk indeksli listeler için türler vermenizi sağlar, vb.
bush
denilen türler hiç görmedim . Onları iç içe geçmiş veya normal olmayan türler olarak gördüm.
bush a
? Bu örnekte, öyle Nest Leaf(a) Leaf(a) Leaf(a) Leaf(a)
ya Nest ((Nest Leaf(a) Leaf(a)) (Nest Leaf(a) Leaf(a)))
setin gibi bir örnek?
Aşağıdaki gibi cebirsel veri türlerini göz önünde bulundurun:
data List a = Nil | Cons a (List a)
: Bir veri türü her yapıcı dönüş türleri hepsi aynı Nil
ve Cons
her iki dönüş List a
. Yapıcıların farklı türler döndürmesine izin verirsek, bir GADT’miz var :
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
Occupied
tipe a -> NullableList a b -> NullableList a NonEmpty
sahipken Cons
, tipe sahip a -> List a -> List a
. Bunun NonEmpty
bir terim değil bir tür olduğunu not etmek önemlidir . Başka bir örnek:
data Zero
data Succ n
data SizedList a t where
Alone :: SizedList a Zero
WithFriends :: a -> SizedList a n -> SizedList a (Succ n)
Programlama dillerinde bağımlı türlere sahip indüktif türler, yapıcıların geri dönüş türlerinin, bağımsız değişkenlerin değerlerine (yalnızca türlerine değil) bağlı olmasını sağlar.
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).
Bir not: GHC, değer yapıcılarını tip kurucuları olarak değerlendirmek için bir mekanizmaya sahiptir . Bu, Coq'un sahip olduğu bağımlı endüktif tiplerle aynı değildir, ancak GADT'lerin sözdizimsel yükünü biraz azaltır ve daha iyi hata mesajlarına yol açabilir.