Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GHCi and compiled code seem to behave differently

Tags:

io

haskell

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?

like image 732
Doug Moore Avatar asked Aug 12 '12 22:08

Doug Moore


1 Answers

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 stdout to flush stdout, causing the output to be printed to the screen, before you call getLine.

Alternatively you can use hSetBuffering NoBuffering to disable buffering altogether, removing the need for hFlush. That could have a negative impact on IO performance though.

like image 165
sepp2k Avatar answered Oct 19 '22 05:10

sepp2k