
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).