[Haskell-beginners] Simple IO problem

Daniel Fischer daniel.is.fischer at web.de
Thu Mar 4 13:44:40 EST 2010


Am Donnerstag 04 März 2010 19:30:17 schrieb Brent Yorgey:
> 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

Another option is to explicitly flush stdout:

import System.IO

main = do
   putStr "Please enter your name: "
   hFlush stdout
   name <- getLine
   putStrLn $ "Hello " ++ name

Whether globally setting the buffering to NoBuffering is better or manually 
flushing the handle in a couple of places depends of course on the 
programme flow (lots of output with few prompts in between, flush manually; 
lots of prompts and little other output, set buffering).



More information about the Beginners mailing list