2012-12-01 28 views
8

मैं अभी भी हास्केल का पता लगाना शुरू कर रहा हूं। मुझे पता है कि यह कोड IO मोनड में "चलाता है"। जब यह l <- ... लाइन से अगले तक जाता है, तो IO - bind कहा जाता है।यह आलसी क्यों नहीं है

कोई ऐसा सोच सकता है क्योंकि हास्केल आलसी है, l का मूल्यांकन कभी नहीं किया जाता है। लेकिन "bind" हमेशा पिछले कमांड का मूल्यांकन करता है, क्या यह सही है? क्योंकि प्रोग्राम "फ़ाइल-नहीं-मिली" त्रुटि उत्पन्न करता है।

main = do 
    l <- mapM readFile [ "/tmp/notfound" ] 
    return() 
+1

'एल का मूल्यांकन कभी नहीं किया गया है - एचएम? आलसी का मतलब "कभी नहीं" है, इसका मतलब है "अभी तक नहीं" या "केवल जब इसकी आवश्यकता होती है।" –

+1

@RobertHarvey हां, लेकिन गैर-हास्केलर्स के लिए, स्रोत कोड को देखते हुए, 'l' अब और उपयोग नहीं किया जाता है। लेकिन इसका इस्तेमाल पूरी तरह से किया जाता है, है ना? – Cartesius00

उत्तर

15

एक सोच सकता है कि क्योंकि हास्केल आलसी है, एल का मूल्यांकन कभी नहीं किया गया है।

हां, और इसका मूल्यांकन कभी नहीं किया जाता है। हालांकि, (>>=) की IO में परिभाषा के कारण, कार्रवाई readFile "/tmp/notfound" निष्पादित की गई है, और इसका मतलब है कि रनटाइम फ़ाइल खोलने का प्रयास करता है। अगर ऐसी कोई फ़ाइल नहीं है, तो "फ़ाइल नहीं मिली" त्रुटि उठाई गई है। अगर ऐसी कोई फ़ाइल थी, तो इसे खोला जाएगा, लेकिन इसकी सामग्री तब तक पढ़ी नहीं जाएगी जब तक कि मांग न हो जाए। उपर्युक्त में, उनकी मांग नहीं की जाती है, इसलिए सामग्री को पढ़ा नहीं जाएगा।

मूल्यांकन किया गया है (और यहां तक ​​कि निष्पादित) l का उत्पादन करने वाली क्रिया है। चूंकि फ़ाइल मौजूद नहीं है, इसलिए यह एक त्रुटि उठाती है।

9

आप अपने कोड में do अंकन का विस्तार करते हैं, तो आपको मिलेगा:

main = (mapM readFile ["/tmp/notfound"]) >>= (\l -> return()) 

तो हाँ, l का मूल्यांकन नहीं किया जाता, लेकिन इसका मतलब यह नहीं है कि mapM करने के लिए कॉल का मूल्यांकन कभी नहीं किया गया है। >>= को कम से कम कुछ डिग्री (कम से कम आईओ मोनैड में और दिमाग में आने वाले किसी अन्य मोनैड में) का मूल्य बनाने के लिए हमेशा अपने बाएं ऑपरेंड का मूल्यांकन करने की आवश्यकता होती है।

संबंधित मुद्दे