[Haskell-beginners] Simple IO problem

Gabríel A. Pétursson gabrielp at simnet.is
Fri Mar 5 08:37:20 EST 2010


On Thu, 2010-03-04 at 13:30 -0500, Brent Yorgey wrote:
> 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

It is also possible to use hFlush from System.IO to force a flush on
stdout.

main = do
	putStr "Hi, "
	hFlush stdout
	name <- getLine
	putStrLn ("You really do like flowers, miss " ++ name)




More information about the Beginners mailing list