
#13440: putStr doesn't have the same behavior in GHCi and after compilation with GHC -------------------------------------+------------------------------------- Reporter: vanto | Owner: (none) Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: duplicate | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: Other | Test Case: Blocked By: | Blocking: Related Tickets: #2189 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by RyanGlScott): * status: new => closed * resolution: => duplicate * related: => #2189 Comment: As it turns out, this is a duplicate of a //long//-standing bug in GHCi, #2189. Fixing that bug will probably require rewriting the whole IO manager to use native Win32 IO (see #11394), but luckily, someone is working on this. Until then, I can offer you two workarounds. 1. If you want to have a stronger guarantee that `"hello"` will be printed first, you can use `hFlush stdout` to force this: {{{#!hs import System.IO main :: IO () main = do { putStr "hello"; hFlush stdout; x <- getChar; -- or x <- getLine; putStr "x = "; print x; } }}} 2. Alternatively, you can try a different buffering strategy. By default, `stdout`'s buffering mode is `NoBuffering` (which should, in theory, mean that all output is immediately printed to the screen, were it not for #2189). But you can change the buffering mode to something else: {{{#!hs import System.IO main :: IO () main = do { hSetBuffering stdout $ BlockBuffering $ Just 1; putStr "hello"; x <- getChar; -- or x <- getLine; putStr "x = "; print x; } }}} This does buffer the output, but only 1 character at a time. I've experimentally verified that both of these workaround work on my Windows machine, on both `cmd.exe` and MSYS2. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13440#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler