यहां कुछ बड़ी समस्याएं हैं।
सबसे पहले, Monad
उदाहरण में kind* -> *
होना चाहिए। इसका मतलब है कि उन्हें कम से कम एक प्रकार परिवर्तनीय की आवश्यकता है, जहां आपके Something
में कोई भी नहीं है। तुलना के लिए:
-- kind * -> *
Maybe
IO
Either String
-- kind *
Maybe Int
IO()
Either String Double
देखें करने से पहले उनका उपयोग कैसे कर सकते Maybe
, IO
, और Either String
प्रत्येक एक प्रकार पैरामीटर की ज़रूरत है? Something
के साथ, वहाँ प्रकार पैरामीटर में भरने के लिए कोई जगह नहीं है तो आप के लिए अपनी परिभाषा को बदलने की जरूरत:।
data Something a = Something a
दूसरी बड़ी समस्या अपने इकाई उदाहरण में >>=
गलत है। आप आमतौर पर डू-नोटेशन का उपयोग नहीं कर सकते क्योंकि यह केवल Monad
फ़ंक्शंस return
और >>=
पर कॉल करता है। इसलिए आपको बिना किसी मोनैड फ़ंक्शंस के लिखना होगा, या तो >>=
या return
पर कॉल करना या कॉल करना होगा।
instance Monad Something where
return a = Something a --Wraps a in 'Something'
(Something m) >>= f = f m --unwraps m and applies it to f
>>=
की परिभाषा आपके अपेक्षा से सरल है। Unwrapping m
आसान है क्योंकि आपको Something
कन्स्ट्रक्टर पर पैटर्न-मिलान की आवश्यकता है। f :: a -> m b
, इसलिए आपको इसे फिर से लपेटने की चिंता करने की आवश्यकता नहीं है, क्योंकि f
आपके लिए यह करता है।
वहाँ सामान्य में एक इकाई खोलने में कोई रास्ता नहीं है, वहीं बहुत सारे विशिष्ट monads unwrapped जा सकता है।
ध्यान रखें कि मोनैड इंस्टेंस घोषणा में डू-नोटेशन या >>=
का उपयोग करने के साथ वाक्य रचनात्मक रूप से गलत नहीं है। समस्या यह है कि >>=
को संक्षेप में परिभाषित किया गया है ताकि जब आप इसे उपयोग करने का प्रयास करते हैं तो प्रोग्राम एक अंतहीन पाश में जाता है।
अपने तीसरे प्रश्न के लिए (N.B. Something
के रूप में यहां बताए गए Identity monad है), हाँ return
समारोह इकाई उदाहरण में परिभाषित किया गया है कि एक बुलाया जाएगा है। टाइप क्लास टाइप द्वारा प्रेषित होते हैं, और जैसा कि आपने निर्दिष्ट किया है कि प्रकार Something b
होना चाहिए संकलक स्वचालित रूप से Something
के लिए मोनाड इंस्टेंस का उपयोग करेगा। (मुझे लगता है कि आप doMagicTo var
होने वाली अंतिम पंक्ति का मतलब है)।
यह बहुत अच्छा है। ये सभी जवाब बहुत अच्छे हैं। मुझे यह टिप्पणी करने के लिए मजबूर होना पड़ता है कि हास्केल समुदाय अब तक का सबसे सहायक और पूरी तरह से सामना कर रहा है। चीयर्स गायस। – providence