मैं अभी भी हास्केल के साथ संघर्ष कर रहा हूँ और अब मैं चारों ओर इनपुट/आउटपुट इकाई from this example मेरे मन लपेटकर के साथ एक समस्या का सामना करना पड़ा:समझना आई/ओ इकाई
main = do
line <- getLine
if null line
then return()
else do
putStrLn $ reverseWords line
main
reverseWords :: String -> String
reverseWords = unwords . map reverse . words
मैं समझता हूँ कि हास्केल तरह कार्यात्मक भाषा पर आधार नहीं कर सकते क्योंकि कार्यों के साइड इफेक्ट्स, कुछ समाधान का आविष्कार किया जाना था। इस मामले में ऐसा लगता है कि सब कुछ do
ब्लॉक में लपेटा जाना है। मुझे सरल उदाहरण मिलते हैं, लेकिन इस मामले में मुझे वास्तव में कुछ स्पष्टीकरण की आवश्यकता है।
आई/ओ कार्यों के लिए एक, एकल do
ब्लॉक का उपयोग करने के लिए पर्याप्त क्यों नहीं है? यदि आपको/else मामले में पूरी तरह से नया क्यों खोलना है? साथ ही, मुझे नहीं पता कि इसे कैसे कॉल किया जाए, do
मोनैड का 'दायरा' समाप्त होता है यानी आप मानक हास्केल नियम/फ़ंक्शंस का उपयोग कब कर सकते हैं?
'do' केवल सिंटैक्टिक चीनी है जो '>> =' और '>>' के साथ अत्यधिक जटिल वक्तव्य लिखने से बचने के लिए है, यह सभी monads के साथ काम करता है, और आईओ के साथ कोई विशेष संबंध नहीं है। आपको उदाहरण कोड में दूसरे 'डू' का उपयोग करने की आवश्यकता नहीं है (आपको पहले 'do' की भी आवश्यकता नहीं है, लेकिन परिणामी कोड पढ़ने के लिए कठिन होगा), आप' else putStrLn (रिवर्सवर्ड लाइन) भी लिख सकते हैं >> मुख्य 'और इसका एक ही प्रभाव होगा। –
मैंने यहां काफी हद तक समान प्रश्न का उत्तर दिया है: http://stackoverflow.com/questions/23049409/simple-haskell-code-cant-compile/23050814#23050814 क्या इससे मदद मिलती है? यह चाल मूल रूप से सभी कार्यों के रिटर्न प्रकारों को देखना है, और सब कुछ जगह में गिर जाएगा। – iamnat
http://stackoverflow.com/questions/2488646/why-are-side-effects-modeled-as-monads-in-haskell?rq=1 में कुछ और स्पष्टीकरण हैं। – dfeuer