ADTs, GADTs और आगमनात्मक प्रकारों के बीच अंतर क्या है?


21

हो सकता है कि किसी के बीच का अंतर समझाने में सक्षम हो:

  • बीजगणितीय डेटाटिप्स (जो मैं काफी परिचित हूं)
  • सामान्यीकृत बीजगणितीय डेटाटिप्स (उन्हें सामान्यीकृत क्या बनाता है?)
  • आगमनात्मक प्रकार (जैसे Coq)

(विशेष रूप से आगमनात्मक प्रकार।) धन्यवाद।

जवाबों:


21

बीजीय डेटा प्रकार आपको पुनरावर्ती प्रकार परिभाषित करते हैं। इसके विपरीत, मान लें कि हमारे पास डेटाटाइप है

टीएलमैंरोंटी=एनमैंएल|सीnरोंएन×एलमैंरोंटी

इसका मतलब यह है कि , N i l और C o n s ऑपरेटरों द्वारा उत्पन्न सबसे छोटा सेट है । हम ऑपरेटर एफ ( एक्स ) को परिभाषित करके इसे औपचारिक रूप दे सकते हैंएलमैंरोंटीएनमैंएलसीnरोंएफ(एक्स)

F(X)=={Nil}{Cons(n,x)|nNxX}

और फिर परिभाषित करने के रूप मेंlist

list=iNFi()

एक सामान्यीकृत ADT वह है जो हमें तब मिलता है जब एक प्रकार ऑपरेटर को पुनरावर्ती रूप से परिभाषित करता है । उदाहरण के लिए, हम निम्न प्रकार के निर्माता को परिभाषित कर सकते हैं:

busha=Leafofa|Nestofbush(a×a)

इस प्रकार का अर्थ है कि b u s का एक तत्व के एक टपल है एक की लंबाई रों 2 n कुछ के लिए n , क्योंकि हर बार जब हम में जाने एन एस टीbushaa2nnNest निर्माता प्रकार तर्क के साथ ही जोड़ा जाता है। इसलिए हम उस ऑपरेटर को परिभाषित कर सकते हैं जिसे हम एक निश्चित बिंदु के रूप में लेना चाहते हैं:

एफ(आर)=λएक्स{एल(एक्स)|एक्सएक्स}{एनरोंटी(v)|vआर(एक्स)}

Coq में एक आगमनात्मक प्रकार अनिवार्य रूप से एक GADT है, जहां टाइप ऑपरेटर के अनुक्रमित अन्य प्रकार (जैसे, उदाहरण के लिए, हास्केल) तक सीमित नहीं हैं, लेकिन प्रकार सिद्धांत के मूल्यों द्वारा भी अनुक्रमित किया जा सकता है । यह आपको लंबाई-अनुक्रमित सूचियों के लिए प्रकार देता है, और इसी तरह।


1
धन्यवाद। हालांकि, इसका मतलब यह नहीं होगा कि पूरी तरह से "निर्भर प्रकार" का पर्यायवाची "आगमनात्मक प्रकार" है?
Ninjagecko

4
@ नील: मैंने कभी bushGADTs जैसे प्रकार नहीं देखे हैं । मैंने उन्हें नेस्टेड या गैर-नियमित प्रकार कहा जाता है।
jbapple

3
नेस्टेड प्रकार GADTs का एक विशेष मामला है। जीएडीटी की महत्वपूर्ण विशेषता यह है कि यह उच्च स्तर पर एक पुनरावर्ती परिभाषा है। (आरएच में परिवर्तन मूल रूप से कंस्ट्रक्टर के एक घटक के रूप में एक प्रकार की समानता को जोड़ने के लिए चीनी है।)
नील कृष्णास्वामी

4
@ninjagecko: "आगमनात्मक प्रकार" एक निर्माणकर्ता के कम से कम निश्चित बिंदु के रूप में शब्दार्थ दिए गए हैं। सभी प्रकारों को इस तरह से वर्णित नहीं किया जा सकता है (कार्य नहीं कर सकते हैं, और न ही अनंत प्रकार जैसे धाराएं)। आश्रित प्रकार उन प्रकारों का वर्णन करते हैं जो कार्यक्रम की शर्तों को उनमें होने की अनुमति देते हैं (अर्थात, प्रकार "शर्तों पर निर्भर कर सकते हैं")। चूँकि Coq एक आश्रित प्रकार का सिद्धांत है, इसलिए यह जो प्रेरक प्रकार आपको परिभाषित करने देता है वह भी निर्भर है। लेकिन गैर-निर्भर प्रकार के सिद्धांत आगमनात्मक प्रकारों का भी समर्थन कर सकते हैं, और वे प्रेरक प्रकार निर्भर नहीं होंगे।
नील कृष्णस्वामी

2
@ नीलकृष्णस्वामी: क्या आप इतने दयालु होंगे कि किस प्रकार के "पहले कुछ सबसे छोटे" तत्वों की गणना करके अपने उत्तर को स्पष्ट करें bush a? इस उदाहरण में, यह है Nest Leaf(a) Leaf(a) Leaf(a) Leaf(a), या Nest ((Nest Leaf(a) Leaf(a)) (Nest Leaf(a) Leaf(a)))सेट के एक उदाहरण के रूप में?
निन्जाएजेको

19

बीजीय डेटाटाइप्स पर विचार करें जैसे:

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 के वाक्यात्मक बोझ को कम करता है, और यह बेहतर त्रुटि संदेशों को जन्म दे सकता है।


धन्यवाद। "प्रोग्रामिंग प्रकारों में प्रेरक प्रकार जिनके आश्रित प्रकार होते हैं" तब एक प्रेरक प्रकार क्या होगा जिसमें कोई निर्भर प्रकारों वाली भाषा नहीं होगी, और क्या आपके पास गैर-प्रेरक (लेकिन जीएडीटी-जैसे) निर्भर प्रकार हो सकते हैं?
Ninjagecko
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.