2009-05-31 17 views
50

मैं स्ट्रिंग की एक सूची है, और करने की कोशिश की इस:हास्केल: "मानचित्र putStrLn" का उपयोग नहीं कर सकता?

ls = [ "banana", "mango", "orange" ] 

main = do 
     map PutStrLn list_of_strings 

कि काम नहीं किया है, और मैं क्यों नहीं समझ सकता।

ghc print-list.hs 
print-list.hs:3:0: 
    Couldn't match expected type `IO t' against inferred type `[IO()]' 
    In the expression: main 
    When checking the type of the function `main' 

कोई संकेत? मुझे लगता है कि इसे एक सूची लौटने वाले मानचित्र के साथ करना है, न कि मूल्य, लेकिन मुझे इसे ठीक करने का कोई आसान तरीका नहीं मिला।

अभी स्ट्रिंग की सूची मुद्रित करने का एकमात्र तरीका एक ऐसा फ़ंक्शन लिखना है जो सूची को पुन: मुद्रित करेगा, प्रत्येक तत्व को प्रिंट करेगा (अगर प्रिंट [ए] प्रिंट करें, लेकिन मुद्रित करें और अगर यह है (रिक: ख))। लेकिन यह अधिक केवल नक्शा उपयोग करने के लिए आसान होगा ...

धन्यवाद!

उत्तर

89

main फ़ंक्शन का प्रकार IO t होना चाहिए (जहां t एक प्रकार परिवर्तनीय है)। map putStrLn ls का प्रकार [IO()] है। यह आपको यह त्रुटि संदेश क्यों मिल रहा है। आप ghci में निम्नलिखित चलाकर इस अपने आप को सत्यापित कर सकते हैं:

समस्या का
Prelude> :type map putStrLn ls 
map putStrLn ls :: [IO()] 

एक समाधान mapM, map की "monadic" संस्करण है जो उपयोग कर रहा है। या आप mapM_ का उपयोग कर सकते हैं जो mapM जैसा ही है लेकिन फ़ंक्शन से लौटाए गए मान एकत्र नहीं करता है। चूंकि आपको putStrLn के वापसी मूल्य की परवाह नहीं है, इसलिए यहां mapM_ का उपयोग करना अधिक उचित है।

mapM_ :: Monad m => (a -> m b) -> [a] -> m() 

इसका इस्तेमाल करने के लिए है:

ls = [ "banana", "mango", "orange" ] 
main = mapM_ putStrLn ls 
+15

कुछ जो मैं चाहता हूं मैं बहुत जल्द सीखा था कि डेटा में परिभाषित एक और नक्शा एम है। ट्रावर्सबल। यह नक्शा एम सूचियों के अलावा अधिक डेटा संरचनाओं का काम करता है, जैसे मानचित्र और सरणी। –

+5

मैंने हमेशा सोचा कि 'मुख्य' प्रकार 'आईओ()' होना चाहिए, कभी नहीं पता था कि यह 'टोल टी' हो सकता है। आईओ टी'। इससे पता चलता है कि आप प्रत्येक दिन कुछ नया कैसे सीख सकते हैं :-) –

19

अयमान का जवाब इस स्थिति के लिए सबसे फ़ायदेमंद mapM_ निम्नलिखित प्रकार है। सामान्यतः, यदि आपके पास [m()] है और आप m() चाहते हैं, तो sequence_ का उपयोग करें, जहां mIO सहित कोई भी मोनड हो सकता है।

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