错误的IO操作顺序使用putStr和getLine
我有以下代码:
main = do putStr "Test input : " content <- getLine putStrLn content  当我运行它(与runhaskell )或编译它(ghc 6.10.4)的结果是这样的: 
 asd Test input : asd 
 为什么Test input : asd之后打印? 
 在使用putStr http://learnyouahaskell.com/上的代码示例中, getLine提供的输出与我的不同。 当我使用putStrLn程序按预期工作(打印,然后提示和打印)。 
 是ghc一个错误,还是它应该工作的方式? 
这是因为ghci禁用缓冲,而用ghc编译的程序默认有行缓冲。 你可以通过运行这个来看到这个:
 import IO main = print =<< hGetBuffering stdout 
 在ghci中,你可以看到NoBuffering而runghc则看到了LineBuffering 。 由于换行符在用户input之后才会打印,提示符也不会显示。 
 在提示后添加hFlush stdout (或者用hSetBuffering stdout NoBuffering禁用缓冲,但可能不好),修复它。