2011-12-20 10 views
10

में stdout करने के लिए एक आईओ स्ट्रिंग लिखना हम एक ऐसे फ़ंक्शन के आउटपुट को कैसे मुद्रित करते हैं जो stoout पर आईओ स्ट्रिंग देता है? मैं शो या प्रिंट का उपयोग करने में सक्षम नहीं हूं।हास्केल

उत्तर

18

आप समारोह foo :: Int -> IO String (उदाहरण के लिए) का परिणाम प्रिंट करना चाहते हैं, तो आप

main = do 
    str <- foo 12 
    putStrLn str 

कर सकते हैं या, do-अंकन के बिना,

main = foo 12 >>= putStrLn. 

do-अंकन है दूसरे के लिए वाक्यात्मक चीनी, जो मौलिक (>>=) Combinator का उपयोग करता है, जो प्रकार है

(>>=) :: Monad m => m a -> (a -> m b) -> m b 

IOMonad कक्षा का एक उदाहरण है, तो आप इसे यहां उपयोग कर सकते हैं।

foo :: Int -> IO String 
foo 12 :: IO String 

putStrLn :: String -> IO() 

(foo 12) >>= putStrLn :: IO() 
6

हम एक समारोह है कि stdout में एक आईओ स्ट्रिंग रिटर्न के उत्पादन में कैसे प्रिंट करूं?

ठीक है देखते हैं। यहाँ एक समारोह है कि एक आईओ स्ट्रिंग रिटर्न है: (! लेकिन फिर भी एक समारोह)

dumbFunction :: a -> IO String 
dumbFunction x = getLine 

dumbFunction एक गूंगा कार्य है। यह इसके इनपुट को अनदेखा करता है, और उसके बाद getLine देता है, जिसमें IO String है।

तो आप मुझे बताएं, आप getLine :: IO String कैसे प्रिंट करते हैं? जवाब है, आप नहीं करते! यही वह है जिसे हम "आईओ एक्शन" कहते हैं। ध्यान दें कि एक आईओ क्रिया एक फ़ंक्शन नहीं है, क्योंकि यह इनपुट लेता है। (हालांकि, आईओ क्रियाएं, अच्छी तरह से, आईओ ऑपरेशंस जैसे getLine के रूप में पढ़ने के लिए इनपुट प्राप्त कर सकती हैं। लेकिन इसे "फ़ंक्शन" नहीं माना जाता है क्योंकि यह किसी भी पारंपरिक इनपुट को स्वीकार नहीं करता है)

तो प्रिंटिंग के बजाय कार्रवाई स्वयं, शायद आप रन कार्रवाई करना चाहते हैं, और फिर परिणाम प्रिंट करें। ऐसा किया जा सकता है क्योंकि डैनियल फिशर ने वर्णन किया है (<- के साथ, जिसे "रन" ऑपरेटर के रूप में माना जा सकता है)।