एक dataघोषणा में, एक प्रकार का निर्माणकर्ता बराबरी के चिह्न के बाईं ओर की चीज है। डेटा निर्माता (रों) दाहिने हाथ की ओर चीजों के बराबर के चिह्न हैं। आप टाइप कंस्ट्रक्टर्स का उपयोग करते हैं जहां एक प्रकार की उम्मीद की जाती है, और आप उन डेटा कंस्ट्रक्टर्स का उपयोग करते हैं जहां एक मूल्य अपेक्षित होता है।
डेटा कंस्ट्रक्टर
चीजों को सरल बनाने के लिए, हम एक प्रकार के उदाहरण से शुरू कर सकते हैं जो एक रंग का प्रतिनिधित्व करता है।
data Colour = Red | Green | Blue
यहां, हमारे पास तीन डेटा कंस्ट्रक्टर हैं। Colourएक प्रकार है, और Greenएक निर्माता है जिसमें प्रकार का मान होता है Colour। इसी तरह, Redऔर Blueदोनों निर्माता हैं जो प्रकार के मूल्यों का निर्माण करते हैं Colour। हम कल्पना कर सकते हैं हालांकि यह spicing!
data Colour = RGB Int Int Int
हमारे पास अभी भी केवल प्रकार है Colour, लेकिन RGBएक मूल्य नहीं है - यह एक फ़ंक्शन है जिसमें तीन इनट्स ले रहे हैं और एक मान लौटा रहे हैं ! RGBप्रकार है
RGB :: Int -> Int -> Int -> Colour
RGBएक डेटा कंस्ट्रक्टर है जो एक फ़ंक्शन है जो कुछ मानों को अपने तर्कों के रूप में लेता है, और फिर एक नए मूल्य का निर्माण करने के लिए उन का उपयोग करता है। यदि आपने कोई ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की है, तो आपको इसे पहचानना चाहिए। OOP में, निर्माता कुछ मानों को तर्क के रूप में लेते हैं और एक नया मान लौटाते हैं!
इस मामले में, यदि हम RGBतीन मूल्यों पर लागू होते हैं, तो हमें एक रंग मूल्य मिलता है!
Prelude> RGB 12 92 27
#0c5c1b
हमने डेटा कंस्ट्रक्टर को लागू करके प्रकार का एक मानColour बनाया है। डेटा कंस्ट्रक्टर में या तो वैरिएबल जैसा कोई मान होता है, या अन्य मानों को इसके तर्क के रूप में लेता है और एक नया मान बनाता है । यदि आपने पिछली प्रोग्रामिंग की है, तो यह अवधारणा आपके लिए बहुत अजीब नहीं होनी चाहिए।
विराम
यदि आप Strings स्टोर करने के लिए एक बाइनरी ट्री का निर्माण करना चाहते हैं , तो आप कुछ ऐसा करने की कल्पना कर सकते हैं
data SBTree = Leaf String
| Branch String SBTree SBTree
हम यहां जो देख रहे हैं वह एक प्रकार SBTreeहै जिसमें दो डेटा निर्माता हैं। दूसरे शब्दों में, वहाँ दो कार्य (अर्थात् हैं Leafऔर Branch) है कि के मूल्यों का निर्माण करेगी SBTreeप्रकार। यदि आप इस बात से परिचित नहीं हैं कि द्विआधारी पेड़ कैसे काम करते हैं, तो बस वहां लटके रहें। आपको वास्तव में यह जानने की आवश्यकता नहीं है कि बाइनरी पेड़ कैसे काम करते हैं, केवल यह कि यह Stringकिसी तरह से स्टोर करता है ।
हम यह भी देखते हैं कि दोनों डेटा निर्माता एक Stringतर्क लेते हैं - यह वह स्ट्रिंग है जिसे वे पेड़ में स्टोर करने जा रहे हैं।
परंतु! क्या होगा अगर हम भी स्टोर करने में सक्षम होना Boolचाहते हैं, तो हमें एक नया बाइनरी ट्री बनाना होगा। यह कुछ इस तरह दिख सकता है:
data BBTree = Leaf Bool
| Branch Bool BBTree BBTree
कंस्ट्रक्टर टाइप करें
दोनों SBTreeऔर BBTreeप्रकार निर्माता ये हैं। लेकिन एक भयावह समस्या है। क्या आप देखते हैं कि वे कितने समान हैं? यह एक संकेत है कि आप वास्तव में एक पैरामीटर कहीं चाहते हैं।
तो हम यह कर सकते हैं:
data BTree a = Leaf a
| Branch a (BTree a) (BTree a)
अब हम टाइप कंस्ट्रक्टर के पैरामीटर के रूप में एक वेरिएबल a टाइप करते हैं। इस घोषणा में, BTreeएक कार्य बन गया है। यह अपने तर्क के रूप में एक प्रकार लेता है और यह एक नया प्रकार लौटाता है ।
एक ठोस प्रकार (उदाहरण शामिल हैं Int, [Char]और Maybe Bool) के बीच अंतर पर विचार करना यहां महत्वपूर्ण है जो एक प्रकार है जिसे आपके कार्यक्रम में एक मूल्य को सौंपा जा सकता है, और एक प्रकार का निर्माण कार्य जिसे आप करने में सक्षम होने के लिए एक प्रकार खिलाने की आवश्यकता है एक मूल्य के लिए सौंपा। एक मान कभी भी "सूची" प्रकार का नहीं हो सकता है, क्योंकि इसे "किसी चीज़ की सूची" होने की आवश्यकता है । एक ही भावना में, एक मूल्य, प्रकार "द्विआधारी पेड़" की कभी नहीं हो सकता है क्योंकि यह एक "बाइनरी पेड़ भंडारण होने की जरूरत है कुछ "।
अगर हम इसमें पास होते हैं, तो Boolएक तर्क के रूप में BTree, यह उस प्रकार को लौटाता है BTree Bool, जो एक द्विआधारी वृक्ष है जो Boolएस स्टोर करता है । प्रकार की प्रत्येक घटना को प्रकार के aसाथ बदलें Bool, और आप स्वयं देख सकते हैं कि यह कैसे सच है।
यदि आप चाहते हैं, तो आप प्रकार केBTree साथ एक फ़ंक्शन के रूप में देख सकते हैं
BTree :: * -> *
प्रकार कुछ प्रकार के होते हैं - *एक ठोस प्रकार को इंगित करता है, इसलिए हम कहते हैं कि BTreeएक ठोस प्रकार से एक ठोस प्रकार है।
समेट रहा हु
यहां एक पल वापस कदम रखें और समानता का ध्यान रखें।
यदि हम अपने मूल्यों में थोड़ी भिन्नता चाहते हैं तो मापदंडों के साथ डेटा निर्माता शांत होते हैं - हम उन भिन्नताओं को मापदंडों में डालते हैं और उस व्यक्ति को मान देते हैं जो मूल्य तय करते हैं कि वे क्या तर्क देने वाले हैं। अगर हम अपने प्रकारों में मामूली बदलाव चाहते हैं! हम उन विविधताओं को मापदंडों के रूप में रखते हैं और उस व्यक्ति को टाइप करने देते हैं जो यह तय करता है कि वे कौन से तर्क देने वाले हैं।
एक मामले का अध्ययन
घर के खिंचाव के रूप में, हम इस Maybe aप्रकार पर विचार कर सकते हैं । इसकी परिभाषा है
data Maybe a = Nothing
| Just a
यहाँ, Maybeएक प्रकार का कंस्ट्रक्टर है जो एक ठोस प्रकार देता है। Justएक डेटा कंस्ट्रक्टर है जो एक मूल्य लौटाता है। Nothingएक डेटा कंस्ट्रक्टर है जिसमें एक मान होता है। यदि हम किस प्रकार को Justदेखते हैं, तो हम देखते हैं
Just :: a -> Maybe a
दूसरे शब्दों में, Justप्रकार का मान लेता है aऔर प्रकार का मान लौटाता है Maybe a। अगर हम उस तरह के को Maybeदेखते हैं, तो हम देखते हैं
Maybe :: * -> *
दूसरे शब्दों में, Maybeएक ठोस प्रकार लेता है और एक ठोस प्रकार देता है।
एक बार फिर! एक ठोस प्रकार और एक प्रकार के निर्माण कार्य के बीच का अंतर। Maybeयदि आप निष्पादित करने का प्रयास करते हैं, तो आप s की सूची नहीं बना सकते हैं
[] :: [Maybe]
आपको एक त्रुटि मिलेगी। आप हालांकि Maybe Int, या की एक सूची बना सकते हैं Maybe a। ऐसा इसलिए Maybeहै क्योंकि एक प्रकार का निर्माण कार्य है, लेकिन एक सूची में एक ठोस प्रकार के मूल्यों को शामिल करने की आवश्यकता है। Maybe Intऔर Maybe aठोस प्रकार हैं (या यदि आप चाहते हैं, तो निर्माण कार्यों को टाइप करने के लिए कॉल करें जो कंक्रीट प्रकार लौटाते हैं।)
Carएक प्रकार का कंस्ट्रक्टर (बाईं ओर=) और एक डेटा कंस्ट्रक्टर (दाईं ओर) दोनों है। पहले उदाहरण में,Carटाइप कंस्ट्रक्टर कोई तर्क नहीं लेता है, दूसरे उदाहरण में इसे तीन लगते हैं। दोनों उदाहरणों में,Carडेटा कंस्ट्रक्टर तीन तर्क लेता है (लेकिन उन तर्कों के प्रकार एक मामले में तय किए गए और दूसरे पैरामीटर में हैं)।