[Haskell-beginners] Simple IO problem

Brent Yorgey byorgey at seas.upenn.edu
Thu Mar 4 13:30:17 EST 2010


On Thu, Mar 04, 2010 at 01:06:42PM -0500, Ali Razavi wrote:
> Why doesn't this work the way it's supposed to, or the way it's intuitively
> apparent from the code, that is, showing the prompt first, getting the line
> next, and printing the result finally?
> 
> main = do
>         putStr "Please Enter Your Name: "
>         name <- getLine
>         putStrLn ("Hello " ++ name)
> 
> 
> changing putStr with putStrLn rectifies it to the expected behavior, but I
> wonder why this version misbehaves. FWIW, I use ghc in cygwin.
> 
> Ali

This is because of output buffering.  By default, LineBuffering is
used, which means that the runtime will collect output in a buffer
until seeing a newline, at which point it will actually print the
buffer contents on the screen.  This is why changing the putStr to
putStrLn makes it work.  You can turn off output buffering like so:

  import System.IO

  main = do hSetBuffering stdout NoBuffering
            putStr "Please Enter Your Name: "
	    ... etc.

-Brent


More information about the Beginners mailing list