एक चीज जो इसे भ्रमित करती है वह है "लोकप्रिय" कार्य जैसे bind
और <*>
प्रैक्सिस ओरिएंटेड। लेकिन अवधारणाओं को समझने के लिए पहले अन्य कार्यों को देखना आसान है। यह भी ध्यान देने योग्य है कि मोनाड बाहर खड़े होते हैं क्योंकि वे अन्य जुड़े हुए अवधारणाओं की तुलना में थोड़ा ओवरहीड होते हैं। इसलिए मैं इसके बजाय फंक्शनलर्स के साथ शुरू करूंगा।
फ़ंक्टर्स एक फ़ंक्शन (हास्केल संकेतन में) प्रदान करते हैं fmap :: (Functor f) => (a -> b) -> f a -> f b
। दूसरे शब्दों में, आपके पास एक संदर्भ है f
जिसे आप किसी फ़ंक्शन को उठा सकते हैं। जैसा कि आप कल्पना कर सकते हैं कि लगभग कुछ भी एक फ़नकार है। सूचियाँ, हो सकता है, या तो, फ़ंक्शंस, I / O, टुपल्स, पार्सर ... प्रत्येक एक संदर्भ का प्रतिनिधित्व करता है जिसमें एक मान प्रकट हो सकता है। तो आप बेहद बहुमुखी कार्य लिख सकते हैं जो लगभग किसी भी संदर्भ में काम करते हैं fmap
या इसके इनलाइन संस्करण का उपयोग करते हैं <$>
।
आप संदर्भों के साथ क्या अन्य सामान करना चाहते हैं? आप दो संदर्भों को संयोजित करना चाह सकते हैं। तो आप zip :: [a] -> [b] -> [(a,b)]
इस तरह के उदाहरण के लिए एक सामान्यीकरण प्राप्त करना चाहते हो सकता है pair :: (Monoidal f) => f a -> f b -> f (a,b)
:।
लेकिन यह और भी अधिक उपयोगी व्यवहार में है, क्योंकि, हास्केल बजाय की पेशकश पुस्तकालयों Applicative
, जिनमें से एक संयोजन है Functor
और Monoidal
, और यह भी की Unit
जो सिर्फ कहते हैं कि आप वास्तव में डाल सकते हैं मूल्यों "अंदर" के साथ अपने संदर्भ, unit
।
आप जिस संदर्भ में काम कर रहे हैं, उसके बारे में इन तीन बातों को बताते हुए आप बेहद सामान्य कार्य लिख सकते हैं।
Monad
बस एक और चीज है जो आप उसके ऊपर बता सकते हैं। मैंने पहले जो उल्लेख नहीं किया है वह यह है कि आपके पास दो संदर्भों को संयोजित करने के लिए पहले से ही दो तरीके हैं: आप न केवल pair
उन्हें, बल्कि आप उन्हें स्टैक भी कर सकते हैं, जैसे कि आपके पास सूचियों की एक सूची हो सकती है। I / O संदर्भ में, एक उदाहरण I / O क्रिया होगी जो किसी फ़ाइल से अन्य I / O क्रियाओं को पढ़ सकती है, इसलिए आपके पास एक प्रकार होगा FilePath -> IO (IO a)
। एक निष्पादन योग्य फ़ंक्शन प्राप्त करने के लिए हम उस स्टैकिंग से कैसे छुटकारा पा सकते हैं IO a
? यही कारण है कि जहां है Monad
रों join
में आता है यह हमें ही प्रकार के दो खड़ी संदर्भों गठबंधन करने के लिए अनुमति देता है। एक ही पर्स के लिए जाता है, हो सकता है आदि और bind
उपयोग करने के लिए सिर्फ एक और अधिक व्यावहारिक तरीका हैjoin
तो एक विवादास्पद संदर्भ में केवल चार चीजों की पेशकश की जाती है और इसका उपयोग I / O के लिए विकसित लगभग सभी मशीनरी के साथ किया जा सकता है, पार्सर के लिए, विफलताओं के लिए आदि।