[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