I\'m fairly new to Haskell, and I\'d like to keep reading lines from the console until the end of the stream, and outputting everything I get in upper case. So far, I\'ve got
This goes way beyond what you're really asking for, but I use this pattern a lot: interact
:
myFun :: String -> String
myFun = ...
main = interact (unlines . myFun . lines)
Your function myFun
will be executed against every line of standard input and the result sent to standard output.
You could also just rely on lazy IO.
import Data.Char
main :: IO ()
main = do
inp <- getContents
let ls = lines inp
upcased = map (map toUpper) ls
mapM_ putStrLn upcased
Another option is to use when
whose documentation can be found 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
Otherwise, the answer is identical to the one by @dave4420.
Use isEOF from 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