खोज…


मूल उपयोग

जब GADTs एक्सटेंशन को सक्षम किया जाता है, तो नियमित डेटा घोषणाओं के अलावा, आप सामान्यकृत बीजीय GADTs भी घोषित कर सकते हैं:

data DataType a where
    Constr1 :: Int -> a -> Foo a -> DataType a
    Constr2 :: Show a => a -> DataType a
    Constr3 :: DataType Int

एक जीएडीटी घोषणा में सभी बिल्डरों के प्रकारों को सूचीबद्ध किया गया है जो एक डेटाटाइप में स्पष्ट रूप से है। नियमित डेटाटाइप घोषणाओं के विपरीत, एक कंस्ट्रक्टर का प्रकार किसी भी एन-एरी (नलरी सहित) फ़ंक्शन हो सकता है जो अंततः कुछ तर्कों पर लागू डेटाैटाइप में परिणाम करता है।

इस मामले में हम घोषित किया है कि प्रकार DataType तीन कंस्ट्रक्टर्स है: Constr1 , Constr2 और Constr3

Constr1 कंस्ट्रक्टर एक नियमित डेटा घोषणा का उपयोग करते हुए घोषित किए गए से अलग नहीं है: data DataType a = Constr1 Int a (Foo a) | ...

Constr2 तथापि की आवश्यकता है कि a का एक उदाहरण है Show , और इसलिए जब निर्माता का उपयोग कर उदाहरण मौजूद हैं की आवश्यकता होगी। दूसरी ओर, जब उस पर पैटर्न मिलान, तथ्य यह है कि a का एक उदाहरण है Show दायरे में आता है, तो आप लिख सकते हैं:

foo :: DataType a -> String
foo val = case val of
    Constr2 x -> show x
    ...

ध्यान दें कि Show a अड़चन Show a फ़ंक्शन के प्रकार में प्रकट नहीं होता है, और केवल -> के दाईं ओर कोड में दिखाई देता है।

Constr3 में DataType Int टाइप किया गया है, जिसका अर्थ है कि जब भी DataType a प्रकार का मान Constr3 , तो यह ज्ञात होता है कि a ~ Int । यह जानकारी, एक पैटर्न मैच के साथ भी पुनर्प्राप्त की जा सकती है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow