2012-03-17 17 views
7

में स्ट्रीम के अंत तक पढ़ें, मैं हास्केल के लिए बिल्कुल नया हूं, और मैं स्ट्रीम के अंत तक कंसोल से पढ़ने की लाइनें रखना चाहता हूं, और ऊपरी मामले में जो कुछ भी प्राप्त करता हूं उसे आउटपुट करना चाहता हूं। अब तक, मैंहैकेल

import Data.Char 

main = myLoop 

myLoop = do inp <- getLine 
      if (inp == "x") 
       then putStrLn "Bye!" 
       else do putStrLn(map toUpper inp) 
         myLoop 

मिल गया है लेकिन, मैं यह पता लगाने if (inp == "x") हालत से बचने और धारा हालत के लिए एक अंत के साथ बदलने के लिए कैसे नहीं कर पा रहे।

संक्षेप में, मैं सी में while (cin >> line) को हास्केल के समकक्ष ++

+0

आपको डेव 4420 से उत्तर का चयन करना चाहिए - यह उन लोगों को इंगित करता है जिनके बारे में आप वर्णन करते हैं कि कौन से समाधान वास्तव में इसका उत्तर देते हैं। – Titou

उत्तर

8

यह आप वास्तव में क्या के लिए पूछ रहे हैं परे रास्ता जाता है, लेकिन मैं इस पद्धति एक बहुत का उपयोग करें: interact:

myFun :: String -> String 
myFun = ... 

main = interact (unlines . myFun . lines) 

आपका समारोह myFun मानक इनपुट के हर लाइन और के खिलाफ निष्पादित किया जाएगा परिणाम मानक आउटपुट को भेजा गया।

+0

मुझे लगता है कि यह एक ghci जिज्ञासा है, लेकिन 'मुख्य = इंटरैक्ट (अनदेखा नक्शा (नक्शा टू अपपर) लाइनें) >> putStrLn" अलविदा "' अंदर काम नहीं करता ghci - यह 'इंटरैक्ट टू अपपर' जैसा है - लेकिन यह करता है कि क्षितिज मेहता क्या चाहता है अगर आप संकलित या रनहास्केल – applicative

+0

@ एप्पलिकेटिव का उपयोग करते हैं जो इसके बारे में काम नहीं करता है? मुझे सामना करने वाली एकमात्र अजीब चीज यह है कि इनपुट के अंत को सिग्नल करने के लिए CTRL-D का उपयोग करने के बजाय, आपको इसे CTRL-C के साथ बाधित करना होगा। यह 'ghc -e' इंटरैक्ट के लिए जाता है (अनदेखा करता है। नक्शा (अप टूपर)। लाइनें) >> putStrLn \ "bye \" "' –

+0

ghci के अंदर, पहली पंक्ति "पहली पंक्ति" इस 'fFiIrRsStT LLiInNeE' – applicative

15

System.IO से उपयोग isEOF की तलाश में हूँ।

import System.IO (isEOF) 
import Data.Char 

main = myLoop 

myLoop = do done <- isEOF 
      if done 
       then putStrLn "Bye!" 
       else do inp <- getLine 
         putStrLn (map toUpper inp) 
         myLoop 
+0

'किए गए == ट्रू' शाखा में कोई सार्थक गणना नहीं होने के बाद से '$ किया गया है ...' का उपयोग करने के लिए यह थोड़ा बेहतर शैली हो सकती है। –

+0

प्रश्न का उत्तर देता है + एक समाधान देता है जो वास्तव में लंबी फ़ाइलों पर काम करता है – Titou

4

आप भी आलसी आईओ पर भरोसा कर सकते हैं।

import Data.Char 

main :: IO() 
main = do 
    inp <- getContents 
    let ls = lines inp 
     upcased = map (map toUpper) ls 
    mapM_ putStrLn upcased 
1

एक अन्य विकल्प when जिसका प्रलेखन here पाया जा सकता है का उपयोग करने के लिए है:

import System.IO (isEOF) 
import Data.Char (toUpper) 
import Control.Monad (forever, when) 
import System.Exit (exitSuccess) 
main = myLoop 

myLoop = forever $ do 
       done <- isEOF 
       when done $ putStrLn "Bye!" >> exitSuccess 
       inp <- getLine 
       putStrLn (map toUpper inp) 
       myLoop 

अन्यथा, इस सवाल का जवाब the one by @dave4420 के समान है।

+0

अपने उत्तर, आदमी से प्यार करो। – Ch3shire