[Haskell] Re: putStr is not evaluated in the correct order

Clifford Beshers clifford.beshers at linspire.com
Mon Sep 4 15:27:49 EDT 2006


Simon Marlow wrote:
>
> We could consider adding a message along the lines you suggest... any 
> other ideas?
>

I remember running into this.  I wasn't confused by the expected 
behavior, it was the fact that ghci had different behavior than compiled 
programs and that the settings seem to be wrong at startup.  I tracked 
down this bug at the time and forgot to report it.

ghci starts with NoBuffering behavior, even though the mode appears to 
be LineBuffering.  Setting it once fixes the problem.

I've included a ghci session that demonstrates the bug by showing the 
change in behavior when pressing Control-D in response to each call to 
getLine. The results are identical for 6.4.1 and 6.6 rc1.



   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.4.1, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base-1.0 ... linking ... done.
Prelude> :m +System.IO
Prelude System.IO> hGetBuffering stdin >>= print
LineBuffering
Prelude System.IO> getLine >>= print
^D
"\EOT"
Prelude System.IO> hSetBuffering stdin NoBuffering >> hGetBuffering 
stdin >>= print
NoBuffering
Prelude System.IO> getLine >>= print
^D
"\EOT"
Prelude System.IO> hSetBuffering stdin LineBuffering >> hGetBuffering 
stdin >>= print
LineBuffering
Prelude System.IO> getLine >>= print
*** Exception: <stdin>: hGetLine: end of file
Prelude System.IO>



   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.5.20060831, for 
Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
Prelude> :m +System.IO
Prelude System.IO> hGetBuffering stdin >>= print
LineBuffering
Prelude System.IO> getLine >>= print
^D
"\EOT"
Prelude System.IO> hSetBuffering stdin NoBuffering >> hGetBuffering 
stdin >>= print
NoBuffering
Prelude System.IO> getLine >>= print
^D
"\EOT"
Prelude System.IO> hSetBuffering stdin LineBuffering >> hGetBuffering 
stdin >>= print
LineBuffering
Prelude System.IO> getLine >>= print
*** Exception: <stdin>: hGetLine: end of file
Prelude System.IO>



More information about the Haskell mailing list