阅读直到haskell的流结束

K M*_*hta 10 haskell

我是Haskell的新手,我想继续从控制台读取行直到流的结尾,然后输出我用大写字母表示的所有内容.到目前为止,我已经有了

import Data.Char

main = myLoop

myLoop = do inp <- getLine
            if (inp == "x") 
              then putStrLn "Bye!"
              else do putStrLn(map toUpper inp)
                      myLoop
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法弄清楚如何避免这种if (inp == "x")情况并用流结束条件替换它.

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

dav*_*420 18

isEOF从System.IO 使用.

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
Run Code Online (Sandbox Code Playgroud)


Car*_*arl 9

你也可以只依赖懒惰的 IO。

import Data.Char

main :: IO ()
main = do
   inp <- getContents
   let ls = lines inp
       upcased = map (map toUpper) ls
   mapM_ putStrLn upcased
Run Code Online (Sandbox Code Playgroud)


Dan*_*ons 9

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

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

main = interact (unlines . myFun . lines)
Run Code Online (Sandbox Code Playgroud)

您的功能myFun将针对标准输入的每一行执行,结果将发送到标准输出.