我对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)
答案 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相同。