मैंने सोचा था कि सैद्धांतिक हैकेल की प्रकार प्रणाली शुद्ध लोगों से अशुद्ध कार्यों (यानी f :: a -> IO b
) को कॉल करने से मना कर देगी, लेकिन आज मुझे एहसास हुआ कि उन्हें return
के साथ बुलाकर वे ठीक से संकलित हैं। उदाहरण में:शुद्ध कार्यों के भीतर आईओ कार्यों का क्या अर्थ है?
h :: Maybe()
h = do
return $ putStrLn "???"
return()
अब, शायद में h
काम करता है इकाई है, लेकिन यह एक शुद्ध समारोह फिर भी है। संकलन और इसे चलाने से बस Just()
लौटाता है जैसा कि कोई उम्मीद करेगा, बिना किसी I/O के। मुझे लगता है कि हैकेल की आलस्य चीजों को एक साथ रखती है (यानी putStrLn
का रिटर्न वैल्यू उपयोग नहीं किया जाता है - और चूंकि इसके मूल्य निर्माता छिपाए नहीं जा सकते हैं और मैं इसके खिलाफ पैटर्न मिलान नहीं कर सकता), लेकिन यह कोड कानूनी क्यों है? क्या कोई अन्य कारण है जो इसे अनुमति देता है?
बोनस के रूप में, संबंधित प्रश्न: सामान्य रूप से, क्या किसी अन्य के भीतर से एक मोनैड के कार्यों के निष्पादन पर रोक लगाना संभव है? कैसे?
मैं एक मोनाड को किसी अन्य से क्रियाओं को निष्पादित करने की क्षमता कैसे दे सकता हूं, इसे मूल्यों के विरुद्ध पैटर्न मिलान की संभावना देकर? –
उन तरीकों को लिखकर जो एक मोनैड को दूसरे में परिवर्तित करते हैं, या कुछ निष्पादन करते हैं। 'Control.Monad.ST.stToIO' उदाहरण के लिए, 'आईओ' गणना में 'एसटी' गणना को परिवर्तित करता है। –
क्रिस्टल स्पष्ट। आप दोनों को धन्यवाद! –