阅读直到haskell的流结束

时间:2012-03-17 23:44:48

标签: haskell

我对Haskell相当新,我想继续从控制台读取行直到流的结尾,并输出我用大写字母表示的所有内容。到目前为止,我已经

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")条件并将其替换为流结束条件。

简而言之,我正在寻找Haskell相当于C ++中的while (cin >> line)

4 个答案:

答案 0 :(得分:17)

使用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

答案 1 :(得分:9)

这超出了你真正要求的范围,但我经常使用这种模式:interact

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

main = interact (unlines . myFun . lines)

您的函数myFun将针对每行标准输入执行,结果将发送到标准输出。

答案 2 :(得分:4)

你也可以依靠懒惰的IO。

import Data.Char

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

答案 3 :(得分:2)

另一种选择是使用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相同。