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.
bushdenilen 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ı Nilve Consher 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
Occupiedtipe a -> NullableList a b -> NullableList a NonEmptysahipken Cons, tipe sahip a -> List a -> List a. Bunun NonEmptybir 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.