
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)