错误的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禁用缓冲,但可能不好),修复它。