यह वास्तव में सिर्फ एक सामान्य डेटा कंस्ट्रक्टर है जो प्रील्यू में परिभाषित होने के लिए होता है , जो मानक पुस्तकालय है जो हर मॉड्यूल में स्वचालित रूप से आयात किया जाता है।
क्या हो सकता है, संरचनात्मक रूप से
परिभाषा कुछ इस तरह दिखती है:
data Maybe a = Just a
| Nothing
यह घोषणा एक प्रकार को परिभाषित करती है Maybe a, जो कि एक प्रकार के चर द्वारा परिचालित होती है a, जिसका अर्थ है कि आप इसका उपयोग किसी भी प्रकार के स्थान पर कर सकते हैं a।
निर्माण और विनाश
प्रकार में दो निर्माता हैं, Just aऔर Nothing। जब एक प्रकार के कई निर्माता होते हैं, तो इसका मतलब है कि प्रकार का एक मूल्य संभव निर्माणकर्ताओं में से केवल एक के साथ बनाया गया है। इस प्रकार के लिए, एक मान या तो निर्माण किया गया था Justया Nothing, कोई अन्य (गैर-त्रुटि) संभावनाएं नहीं हैं।
चूंकि Nothingकोई पैरामीटर प्रकार नहीं है, जब इसे एक निर्माता के रूप में उपयोग किया जाता है तो यह एक निरंतर मूल्य का नाम देता है जो Maybe aसभी प्रकारों के लिए एक प्रकार का सदस्य है a। लेकिन Justकंस्ट्रक्टर के पास एक प्रकार का पैरामीटर होता है, जिसका अर्थ है कि जब एक कंस्ट्रक्टर के रूप में उपयोग किया जाता aहै Maybe a, तो यह प्रकार से फ़ंक्शन की तरह कार्य करता है , अर्थात इसका प्रकार होता हैa -> Maybe a
तो, एक प्रकार के निर्माता उस प्रकार के मूल्य का निर्माण करते हैं; चीजों का दूसरा पक्ष वह है जब आप उस मूल्य का उपयोग करना चाहते हैं, और वह वह जगह है जहां पैटर्न मिलान खेलने के लिए आता है। फ़ंक्शंस के विपरीत, कंस्ट्रक्टर्स का उपयोग पैटर्न बाइंडिंग अभिव्यक्तियों में किया जा सकता है, और यह वह तरीका है जिसमें आप उन मानों का केस विश्लेषण कर सकते हैं जो एक से अधिक कंस्ट्रक्टर वाले टाइप के हैं।
Maybe aएक पैटर्न मैच में एक मूल्य का उपयोग करने के लिए , आपको प्रत्येक निर्माता के लिए एक पैटर्न प्रदान करने की आवश्यकता है, जैसे:
case maybeVal of
Nothing -> "There is nothing!"
Just val -> "There is a value, and it is " ++ (show val)
उस स्थिति में अभिव्यक्ति, पहला पैटर्न मैच होगा यदि मूल्य था Nothing, और दूसरा मैच होगा अगर मूल्य के साथ निर्माण किया गया था Just। यदि दूसरा एक मेल खाता है, तो यह valउस पैरामीटर को नाम भी बांधता है जो उस Justकंस्ट्रक्टर को पास किया गया था जब आप जिस मूल्य के खिलाफ मिलान कर रहे थे उसका निर्माण किया गया था।
क्या हो सकता है मतलब
शायद आप पहले से ही परिचित थे कि यह कैसे काम करता है; Maybeमूल्यों के लिए वास्तव में कोई जादू नहीं है, यह सिर्फ एक सामान्य हास्केल बीजीय डेटा प्रकार (एडीटी) है। लेकिन इसका काफी उपयोग किया जाता है क्योंकि यह प्रभावी रूप से "लिफ्ट करता है" या एक प्रकार का विस्तार करता है, जैसे कि Integerआपके उदाहरण से, एक नए संदर्भ में जिसमें इसका एक अतिरिक्त मूल्य ( Nothing) है जो मूल्य की कमी का प्रतिनिधित्व करता है! उस प्रकार की प्रणाली के लिए आवश्यक है कि आप उस अतिरिक्त मूल्य की जांच करें, इससे पहले कि आप Integerउस स्थान पर पहुंच सकें । यह बग की एक उल्लेखनीय संख्या को रोकता है।
कई भाषाएं आज इस प्रकार के "नो-वैल्यू" मूल्य को NULL संदर्भों के माध्यम से संभालती हैं। प्रख्यात कंप्यूटर वैज्ञानिक टोनी होरे (उन्होंने क्विकॉर्ट का आविष्कार किया और ट्यूरिंग अवार्ड विजेता हैं), यह उनकी "अरब डॉलर की गलती" के रूप में है । शायद इसे ठीक करने का एकमात्र तरीका नहीं है, लेकिन यह इसे करने का एक प्रभावी तरीका साबित हुआ है।
शायद एक फ़नकार के रूप में
एक प्रकार को दूसरे प्रकार में बदलने का विचार ऐसा है कि पुराने प्रकार के संचालन को भी नए प्रकार पर काम करने के लिए रूपांतरित किया जा सकता है Functor, जिसे हास्केल प्रकार वर्ग कहा जाता है , जिसके Maybe aपीछे एक उपयोगी उदाहरण है।
Functorनामक एक विधि प्रदान करता है fmap, जो कार्यों को आधार प्रकार (जैसे Integer) से मानों तक ले जाने वाले कार्यों को उठाता है जो कि उठाए गए प्रकार (जैसे जैसे Maybe Integer) से मानों की सीमा होती है । एक मान इस तरह काम करता है के साथ fmapकाम करने के लिए तब्दील एक समारोह Maybe:
case maybeVal of
Nothing -> Nothing -- there is nothing, so just return Nothing
Just val -> Just (f val) -- there is a value, so apply the function to it
तो अगर आपके पास एक Maybe Integerमूल्य m_xऔर एक Int -> Intफ़ंक्शन है f, तो आप fmap f m_xफ़ंक्शन fको Maybe Integerबिना किसी चिंता के सीधे लागू करने के लिए कर सकते हैं यदि यह वास्तव में एक मूल्य है या नहीं। वास्तव में, आप मूल्यों के Integer -> Integerलिए उठाए गए कार्यों की एक पूरी श्रृंखला लागू कर सकते Maybe Integerहैं और केवल Nothingएक बार समाप्त होने पर स्पष्ट रूप से जांच करने के बारे में चिंता करना होगा ।
शायद एक मोनाड के रूप में
मुझे यकीन नहीं है कि आप Monadअभी तक की अवधारणा से कितने परिचित हैं , लेकिन आपने IO aपहले कम से कम उपयोग किया है , और टाइप हस्ताक्षर IO aउल्लेखनीय रूप से समान दिखता है Maybe a। हालाँकि IOयह विशेष है कि यह आपके कंस्ट्रक्टरों को आपके सामने उजागर नहीं करता है और इस प्रकार हास्केल रनटाइम सिस्टम द्वारा केवल "रन" किया जा सकता है, यह अभी भी एक Functorहोने के अलावा एक है Monad। वास्तव में, एक महत्वपूर्ण अर्थ है जिसमें कुछ अतिरिक्त विशेषताओं Monadके Functorसाथ एक विशेष प्रकार का एक प्रकार है, लेकिन यह उस स्थान पर नहीं है।
वैसे भी, मैप्स IOनए प्रकारों को पसंद करते हैं जो "अभिकलन जो मूल्यों में परिणत होते हैं" का प्रतिनिधित्व करते हैं और आप फ़ंक्शन को Monadप्रकारों में उठा सकते हैं, fmapजैसे एक बहुत -समान फ़ंक्शन के माध्यम से, जो liftMएक नियमित फ़ंक्शन को "अभिकलन" में बदल देता है, जिसके परिणामस्वरूप मूल्य का मूल्यांकन करके प्राप्त किया जाता है। समारोह।"
आपने शायद अनुमान लगाया है (यदि आपने इसे दूर तक पढ़ा है) जो कि Maybeएक भी है Monad। यह "अभिकलन का प्रतिनिधित्व करता है जो एक मूल्य को वापस करने में विफल हो सकता है"। fmapउदाहरण के साथ , यह आपको प्रत्येक चरण के बाद त्रुटियों की स्पष्ट जाँच किए बिना संगणनाओं का एक पूरा गुच्छा बनाने की सुविधा देता है। और वास्तव में, जिस तरह से Monadउदाहरण का निर्माण किया जाता है, Maybeमूल्यों का एक संगणना सामने आते ही रुक जाताNothing है, इसलिए यह एक तत्काल गर्भपात की तरह है या एक संगणना के बीच में एक वैधता वापसी।
हो सकता है आपने लिखा हो
जैसा कि मैंने पहले कहा था, Maybeभाषा सिंटैक्स या रनटाइम सिस्टम में बेक किए गए प्रकार के लिए कुछ भी अंतर्निहित नहीं है। यदि हास्केल इसे डिफ़ॉल्ट रूप से प्रदान नहीं करता है, तो आप इसकी सभी कार्यक्षमता स्वयं प्रदान कर सकते हैं! वास्तव में, आप इसे फिर से अपने आप को किसी भी तरह से, अलग-अलग नामों से लिख सकते हैं और समान कार्यक्षमता प्राप्त कर सकते हैं।
उम्मीद है कि आप Maybeअब इसके प्रकार और इसके निर्माणकर्ताओं को समझेंगे , लेकिन अगर अभी भी कुछ स्पष्ट नहीं है, तो मुझे बताएं!
Maybeजहां अन्य भाषाएं उपयोग करती हैंnullयाnil(NullPointerExceptionहर कोने में गंदा एस लुकिंग के साथ )। अब अन्य भाषाएं भी इस निर्माण का उपयोग करना शुरू कर देती हैं, जैसे: स्कालाOption, और यहां तक कि जावा 8 का भीOptionalप्रकार होगा।