[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