सामान्यीकृत बीजीय डेटा प्रकार

From Vigyanwiki

कार्यात्मक प्रोग्रामिंग में, एक सामान्यीकृत बीजगणितीय डेटा प्रकार (जीएडीटी, प्रथम श्रेणी फैंटम प्रकार,[1] संरक्षित पुनरावर्ती डेटाटाइप,[2] या समानता-योग्य प्रकार [3]) पैरामीट्रिक बीजगणितीय डेटा प्रकारों का एक सामान्यीकरण है।

सिंहावलोकन

जीएडीटी में, प्रोडक्ट कंस्ट्रक्टर (हास्केल में डेटा कंस्ट्रक्टर कहा जाता है) अपने रिटर्न वैल्यू (प्रतिफल मान) के प्रकार इंस्टेंशियेशन (दृष्टांतिकरण) के रूप में एडीटी का एक स्पष्ट इंस्टेंशियेशन प्रदान कर सकते हैं। यह कार्यों को अधिक उन्नत प्रकार के व्यवहार के साथ परिभाषित करने की अनुमति देता है। हास्केल 2010 के डेटा कंस्ट्रक्टर के लिए, रिटर्न वैल्यू में कंस्ट्रक्टर के एप्लिकेशन पर एडीटी पैरामीटर्स के इंस्टेंशियशन द्वारा निहित प्रकार इंस्टेंशियशन होता है।

-- A parametric ADT that is not a GADT
data List a = Nil | Cons a (List a)

integers = Cons 12 (Cons 107 Nil)       -- the type of integers is List Int
strings = Cons "boat" (Cons "dock" Nil) -- the type of strings is List String

-- A GADT
data Expr a where
    EBool  :: Bool     -> Expr Bool
    EInt   :: Int      -> Expr Int
    EEqual :: Expr Int -> Expr Int  -> Expr Bool

eval :: Expr a -> a

eval e = case e of
    EBool a    -> a
    EInt a     -> a
    EEqual a b -> (eval a) == (eval b)

expr1 = EEqual (EInt 2) (EInt 3)        -- the type of expr1 is Expr Bool
ret = eval expr1                        -- ret is False

वे वर्तमान में जीएचसी कंपाइलर में एक गैर-मानक एक्सटेंशन के रूप में कार्यान्वित किए जाते हैं, जिनका उपयोग अन्य लोगों के अलावा, पग्स और डार्क्स द्वारा किया जाता है। ओकैमल संस्करण 4.00 से मूल रूप से जीएडीटी का समर्थन करता है।[4]

जीएचसी कार्यान्वयन अस्तित्वगत मात्रात्मक प्रकार के मापदंडों और स्थानीय बाधाओं के लिए समर्थन प्रदान करता है।

इतिहास

सामान्यीकृत बीजीय डेटा प्रकारों का प्रारंभिक संस्करण ऑगस्टसन और पीटरसन (1994) द्वारा वर्णित किया गया था और यह एएलएफ में पैटर्न मिलान पर आधारित था।

सामान्यीकृत बीजगणितीय डेटा प्रकार स्वतंत्र रूप से चेनी और हिंज (2003) द्वारा और उससे पहले शी, चेन और चेन (2003) द्वारा एमएल और हास्केल के बीजीय डेटा प्रकारों के विस्तार के रूप में पेश किए गए थे।[5] दोनों मूलतः एक-दूसरे के समतुल्य हैं। वे सीओक्यू के कैलकुलस ऑफ इंडक्टिव कंस्ट्रक्शन और अन्य आश्रित रूप से टाइप की गई भाषाओं में पाए जाने वाले डेटा प्रकारों (या इंडक्टिव डेटाटाइप्स) के इंडक्टिव वर्गों के समान हैं, आश्रित प्रकारों को मॉड्यूल करते हैं और सिवाय इसके कि उत्तरार्द्ध में एक अतिरिक्त सकारात्मकता प्रतिबंध है जो जीएडीटी में लागू नहीं होता है।[6]

सुल्ज़मैन, वाज़नी और स्टकी (2006) ने विस्तारित बीजीय डेटा प्रकार पेश किए जो जीएडीटी को अस्तित्वगत डेटा प्रकारों और प्रकार वर्ग बाधाओं के साथ संबद्ध करते हैं।

किसी भी प्रोग्रामर द्वारा प्रदत्त प्रकार के एनोटेशन के अभाव में प्रकार का अनुमान अनिर्णीत है[7] और जीएडीटी पर परिभाषित फ़ंक्शन सामान्य रूप से प्रमुख प्रकारों को स्वीकार नहीं करते हैं।[8] टाइप पुनर्निर्माण के लिए कई डिज़ाइन ट्रेड-ऑफ़ की आवश्यकता होती है और यह सक्रिय अनुसंधान का एक क्षेत्र है (पेयटन जोन्स, वॉशबर्न और वेइरिच 2004; पेयटन जोन्स एट अल 2006)।

2021 के स्प्रिंग में, स्काला 3.0 जारी किया गया है।[9] स्काला का यह प्रमुख अपडेट एडीटी के समान सिंटैक्स के साथ जीएडीटी[10] लिखने की संभावना पेश करता है, जो मार्टिन ओडर्सकी के अनुसार अन्य प्रोग्रामिंग भाषाओं में नहीं है।[11]

अनुप्रयोग

जीएडीटी के अनुप्रयोगों में सामान्य प्रोग्रामिंग, मॉडलिंग प्रोग्रामिंग भाषाएं (उच्च-क्रम अमूर्त वाक्यविन्यास), डेटा संरचनाओं में अपरिवर्तनीयता बनाए रखना, एम्बेडेड डोमेन-विशिष्ट भाषाओं में बाधाओं को व्यक्त करना और मॉडलिंग ऑब्जेक्ट सम्मिलित हैं।[12]

उच्च-क्रम अमूर्त वाक्यविन्यास

जीएडीटी का एक महत्वपूर्ण अनुप्रयोग उच्च-क्रम के अमूर्त वाक्यविन्यास को एक प्रकार-सुरक्षित विधि से एम्बेड करना है। यहां आधार प्रकारों, ट्यूपल्स और एक निश्चित बिंदु कॉम्बिनेटर के मनमाने संग्रह के साथ सरल रूप से टाइप किए गए लैम्ब्डा कैलकुलस का एक एम्बेडिंग है:

data Lam :: * -> * where
  Lift :: a                     -> Lam a        -- ^ lifted value
  Pair :: Lam a -> Lam b        -> Lam (a, b)   -- ^ product
  Lam  :: (Lam a -> Lam b)      -> Lam (a -> b) -- ^ lambda abstraction
  App  :: Lam (a -> b) -> Lam a -> Lam b        -- ^ function application
  Fix  :: Lam (a -> a)          -> Lam a        -- ^ fixed point

और एक प्रकार का सुरक्षित मूल्यांकन फंक्शन:

eval :: Lam t -> t
eval (Lift v)   = v
eval (Pair l r) = (eval l, eval r)
eval (Lam f)    = \x -> eval (f (Lift x))
eval (App f x)  = (eval f) (eval x)
eval (Fix f)    = (eval f) (eval (Fix f))

भाज्य फलन को अब इस प्रकार लिखा जा सकता है:

fact = Fix (Lam (\f -> Lam (\y -> Lift (if eval y == 0 then 1 else eval y * (eval f) (eval y - 1)))))
eval(fact)(10)

हमें नियमित बीजीय डेटा प्रकारों का उपयोग करने में समस्याओं का सामना करना पड़ा होगा। प्रकार पैरामीटर को छोड़ने से उठाए गए आधार प्रकारों को अस्तित्वगत रूप से परिमाणित किया जा सकता है, जिससे मूल्यांकनकर्ता को लिखना असंभव हो जाता है। एक प्रकार के पैरामीटर के साथ, हम अभी भी एक ही आधार प्रकार तक सीमित रहेंगे। इसके अलावा,App (Lam (\x -> Lam (\y -> App x y))) (Lift True)जैसे गलत तरीके से बनाए गए व्यंजक का निर्माण संभव होगा, जबकि वे जीएडीटी का उपयोग करके गलत टाइप किए गए हैं। एक सुगठित एनालॉग App (Lam (\x -> Lam (\y -> App x y))) (Lift (\z -> True)) है। इसका कारण यह है कि x का प्रकार Lam (a -> b) है, जिसका अनुमान Lamडेटा कंस्ट्रक्टर के प्रकार से लगाया गया है।

यह भी देखें

  • चर प्रकार

टिप्पणियाँ

  1. Cheney & Hinze 2003.
  2. Xi, Chen & Chen 2003.
  3. Sheard & Pasalic 2004.
  4. "OCaml 4.00.1". ocaml.org.
  5. Cheney & Hinze 2003, p. 25.
  6. Cheney & Hinze 2003, pp. 25–26.
  7. Peyton Jones, Washburn & Weirich 2004, p. 7.
  8. Schrijvers et al. 2009, p. 1.
  9. Kmetiuk, Anatolii. "SCALA 3 IS HERE!🎉🎉🎉". scala-lang.org. École Polytechnique Fédérale Lausanne (EPFL) Lausanne, Switzerland. Retrieved 19 May 2021.
  10. "SCALA 3 — BOOK ALGEBRAIC DATA TYPES". scala-lang.org. École Polytechnique Fédérale Lausanne (EPFL) Lausanne, Switzerland. Retrieved 19 May 2021.
  11. Odersky, Martin. "A Tour of Scala 3 - Martin Odersky". youtube.com. Scala Days Conferences. Archived from the original on 2021-12-19. Retrieved 19 May 2021.
  12. Peyton Jones, Washburn & Weirich 2004, p. 3.

अग्रिम पठन

Applications
Semantics
Type reconstruction
Other


बाहरी संबंध