I have a very strange problem. The following code gives different results when compiled as compared to running in ghci,
main = do
putStr "Please enter your name: "
name <- getLine
putStr ("Hello, " ++ name ++ ", how are you?")
When run it in ghci it does as one would expect,
Please enter your name: dglmoore
Hello, dglmoore, how are you?
However, when I compile the code to an executable it requires that I provide the input before any output is generated so I end up with this,
dglmoore
Please enter your name: Hello, dglmoore, how are you?
I’ve seen a similar problem before, but I cannot seem to find it again.
I am using ghc version 7.4.1 from the Haskell Platform version 2012.2.0.0.
Anyone have any idea why they give different results and how I can get both versions to do the “correct” thing?
It’s a buffering issue. Usually IO is line buffered (i.e. the output doesn’t actually show up on the screen until you print a new line or exceed the buffer size) unless you explicitly flush the buffer. In ghci it isn’t, so the issue doesn’t show up.
You can use
hFlush stdoutto flush stdout, causing the output to be printed to the screen, before you callgetLine.Alternatively you can use
hSetBuffering NoBufferingto disable buffering altogether, removing the need forhFlush. That could have a negative impact on IO performance though.