How to Read from stdin in Haskell
In haskell there are two ways to read the stdin stream. Which one to use depends on what you’re trying to accomplish I guess.
Either you can read each line in a loop.
import System.IO
main = myLoop
myLoop = do done <- isEOF
            if done
              then putStrLn ""
              else do inp <- getLine
                      putStrLn inp
                      myLoop
We call the myLoop function recursively until getLine returns EOF. Every time we get a string back, we print it to stdout and call ourselves again.
The other method involves reading the entire stream with getContents and then lazily read each line.
import Data.Char
main :: IO ()
main = do
   inp <- getContents
   let ls = lines inp
   mapM_ putStrLn ls
Here we get the stream into inp, split that into an array of lines, and map that array to the putStrLn function, which prints to stdout.