मैंने हमेशा एक मकसद के सापेक्ष एक मोनैड की शक्ति के निम्नलिखित अंतर्ज्ञानी स्पष्टीकरण का आनंद लिया है: एक मोनड आकार बदल सकता है; एक मजेदार नहीं कर सकता।एक फंक्टर के विपरीत, एक मोनाड आकार बदल सकता है?
उदाहरण के लिए: length $ fmap f [1,2,3]
हमेशा 3
के बराबर है।
एक मोनड के साथ, हालांकि, length $ [1,2,3] >>= g
अक्सर 3
के बराबर नहीं होगा। उदाहरण के लिए, यदि g
परिभाषित किया गया है के रूप में:
g :: (Num a) => a -> [a]
g x = if x==2 then [] else [x]
तो [1,2,3] >>= g
[1,3]
के बराबर है।
जो चीज़ मुझे थोड़ा परेशान करती है, वह g
का प्रकार हस्ताक्षर है। यह इस तरह के रूप में एक सामान्य monadic प्रकार के साथ एक समारोह जो इनपुट के आकार में परिवर्तन को परिभाषित करने के लिए असंभव लगता है:
h :: (Monad m, Num a) => a -> m a
MonadPlus या MonadZero प्रकार कक्षाएं []
के बजाय का उपयोग करने के लिए प्रासंगिक शून्य तत्व है, लेकिन अब हम एक मोनड से कुछ और है।
क्या मैं सही हूँ? यदि हां, तो क्या इस सूक्ष्मता को हास्केल में नवागंतुक को व्यक्त करने का कोई तरीका है। मैं अपने प्यारे "monads आकार बदल सकते हैं" वाक्यांश बनाना चाहते हैं, बस एक स्पर्श अधिक ईमानदार; अगर जरूरत हो।
लेकिन आप 'अनुक्रम' जैसी चीजें कर सकते हैं, है ना? मैं कहूंगा कि संरचना निश्चित रूप से "बदल रही है"। – Rotsor
@Rotsor: वास्तव में नहीं। 'अनुक्रम' केवल मौजूदा संरचनाओं को समान रूप से जोड़ता है '(>> =)' करता है, लेकिन यह चीजों की पूरी सूची को एक साथ जोड़कर करता है। यह ऐसी कुछ भी नहीं कर सकता जो उस सूची में नहीं है जिसे आप इसे लागू करते हैं। –
ठीक है, हाँ, यह संरचना को सीमित आकार में बदलता है - मौजूदा आकारों को जोड़कर, लेकिन यह आवश्यकता को पूरा करता है: इसमें एक सामान्य प्रकार है और आकार बदलता है। मैंने अपना खुद का जवाब के रूप में एक और उदाहरण पोस्ट किया है। – Rotsor