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