हो सकता है कि किसी के बीच का अंतर समझाने में सक्षम हो:
- बीजगणितीय डेटाटिप्स (जो मैं काफी परिचित हूं)
- सामान्यीकृत बीजगणितीय डेटाटिप्स (उन्हें सामान्यीकृत क्या बनाता है?)
- आगमनात्मक प्रकार (जैसे Coq)
(विशेष रूप से आगमनात्मक प्रकार।) धन्यवाद।
हो सकता है कि किसी के बीच का अंतर समझाने में सक्षम हो:
(विशेष रूप से आगमनात्मक प्रकार।) धन्यवाद।
जवाबों:
बीजीय डेटा प्रकार आपको पुनरावर्ती प्रकार परिभाषित करते हैं। इसके विपरीत, मान लें कि हमारे पास डेटाटाइप है
इसका मतलब यह है कि , N i l और C o n s ऑपरेटरों द्वारा उत्पन्न सबसे छोटा सेट है । हम ऑपरेटर एफ ( एक्स ) को परिभाषित करके इसे औपचारिक रूप दे सकते हैं
और फिर परिभाषित करने के रूप में
एक सामान्यीकृत ADT वह है जो हमें तब मिलता है जब एक प्रकार ऑपरेटर को पुनरावर्ती रूप से परिभाषित करता है । उदाहरण के लिए, हम निम्न प्रकार के निर्माता को परिभाषित कर सकते हैं:
इस प्रकार का अर्थ है कि b u s का एक तत्व के एक टपल है एक की लंबाई रों 2 n कुछ के लिए n , क्योंकि हर बार जब हम में जाने एन ई एस टी निर्माता प्रकार तर्क के साथ ही जोड़ा जाता है। इसलिए हम उस ऑपरेटर को परिभाषित कर सकते हैं जिसे हम एक निश्चित बिंदु के रूप में लेना चाहते हैं:
Coq में एक आगमनात्मक प्रकार अनिवार्य रूप से एक GADT है, जहां टाइप ऑपरेटर के अनुक्रमित अन्य प्रकार (जैसे, उदाहरण के लिए, हास्केल) तक सीमित नहीं हैं, लेकिन प्रकार सिद्धांत के मूल्यों द्वारा भी अनुक्रमित किया जा सकता है । यह आपको लंबाई-अनुक्रमित सूचियों के लिए प्रकार देता है, और इसी तरह।
bush
GADTs जैसे प्रकार नहीं देखे हैं । मैंने उन्हें नेस्टेड या गैर-नियमित प्रकार कहा जाता है।
bush a
? इस उदाहरण में, यह है Nest Leaf(a) Leaf(a) Leaf(a) Leaf(a)
, या Nest ((Nest Leaf(a) Leaf(a)) (Nest Leaf(a) Leaf(a)))
सेट के एक उदाहरण के रूप में?
बीजीय डेटाटाइप्स पर विचार करें जैसे:
data List a = Nil | Cons a (List a)
डेटाटाइप में प्रत्येक निर्माता का रिटर्न प्रकार सभी समान हैं: Nil
और Cons
दोनों वापस आते हैं List a
। यदि हम कंस्ट्रक्टरों को विभिन्न प्रकारों को वापस करने की अनुमति देते हैं, तो हमारे पास 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
Occupied
प्रकार है a -> NullableList a b -> NullableList a NonEmpty
, जबकि Cons
प्रकार है a -> List a -> List a
। यह ध्यान रखना महत्वपूर्ण है कि NonEmpty
एक प्रकार है, एक शब्द नहीं। एक और उदाहरण:
data Zero
data Succ n
data SizedList a t where
Alone :: SizedList a Zero
WithFriends :: a -> SizedList a n -> SizedList a (Succ n)
प्रोग्रामिंग भाषाओं में प्रेरक प्रकार जिनके आश्रित प्रकार होते हैं, वे लौटने वालों के प्रकारों को तर्कों के मूल्यों (न केवल प्रकारों) पर निर्भर करने की अनुमति देते हैं।
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).
एक साइड नोट: जीएचसी में वैल्यू कंस्ट्रक्टर्स को टाइप कंस्ट्रक्टर के रूप में व्यवहार करने के लिए एक तंत्र है । यह कोक के पास आश्रित आगमनात्मक प्रकारों के समान नहीं है, लेकिन यह कुछ हद तक GADT के वाक्यात्मक बोझ को कम करता है, और यह बेहतर त्रुटि संदेशों को जन्म दे सकता है।