2017-08-08 19 views
11

"वापसी एक" कुछ इकाई के संदर्भ में एक रैप करने के लिए माना जाता है:क्यों कुछ भी वापस नहीं लौटाता है?

*Main> :i return 
class Applicative m => Monad (m :: * -> *) where 
    ... 
    return :: a -> m a 
    ... 
     -- Defined in ‘GHC.Base’ 

अगर मैं GHCi पूछना क्या "वापस कुछ नहीं" के प्रकार है, यह है कि के अनुरूप है:

*Main> :t return Nothing 
return Nothing :: Monad m => m (Maybe a) 

लेकिन अगर मैं इसे का मूल्यांकन, मुझे कोई बाहरी इकाई देखते हैं, सिर्फ भीतरी शायद:

*Main> return Nothing 
Nothing 
+11

GHCi आईओ इकाई को चूक करता है, तो आप एक निर्दिष्ट नहीं करते। यह सिर्फ 'आईओ (शायद ए)' – 4castle

+7

@ 4castle की सामग्री को प्रिंट कर रहा है, शाकाफ को थोड़ा गलत मिसाल देने के लिए: एक 'आईओ (शायद ए)' में 'शायद एक' है जिसमें '/ bin/ls' में एक सूची है फाइलों का यह थोड़ा सा pedantic लग सकता है, लेकिन यह 'आईओ (शायद ए) 'की सामग्री छाप नहीं है। यह एक 'आईओ (शायद ए)' चला रहा है और फिर उसके परिणामों को प्रिंट कर रहा है। भेद महत्वपूर्ण हो सकता है। –

+1

@ डेविड यॉन्ग मुझे व्यक्तिगत रूप से महत्वपूर्ण होने का गौरव नहीं मिलता है, क्योंकि यह मूल्य के आंतरिक प्रतिनिधित्व को जानने के लिए आईओ मोनैड का काम है। तर्क उद्देश्यों के लिए, मैं आम तौर पर कंटेनरों के रूप में सभी मोनैड के बारे में सोचता हूं (चाहे वे वास्तव में मूल्य रखते हों या नहीं)। – 4castle

उत्तर

21

GHCi एक मूल्य मुद्रित करने के लिए हो जाता है, यह दो अलग बातें की कोशिश करता है। सबसे पहले, यह a के लिए IO a के साथ प्रकार को एकीकृत करने का प्रयास करता है। यदि यह ऐसा कर सकता है तो यह आईओ कार्रवाई निष्पादित करता है और परिणाम मुद्रित करने का प्रयास करता है। यदि यह ऐसा नहीं कर सकता है, तो यह दिए गए मान को मुद्रित करने का प्रयास करता है। आपके मामले में, Monad m => m (Maybe a)IO (Maybe a) के साथ एकीकृत किया जा सकता है।

की समीक्षा इस GHCi सत्र मदद कर सकता है:

Prelude> return Nothing 
Nothing 
Prelude> return Nothing :: IO (Maybe a) 
Nothing 
Prelude> return Nothing :: Maybe (Maybe a) 
Just Nothing 
Prelude> Nothing 
Nothing 
संबंधित मुद्दे