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