错误的IO操作使用putStr和getLine进行排序

时间:2010-03-23 13:59:27

标签: haskell io ghc buffering

我有以下代码:

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中的错误,还是它应该起作用的方式?

1 个答案:

答案 0 :(得分:52)

这是因为ghci禁用缓冲,而使用ghc编译的程序默认具有行缓冲。你可以通过运行这个来看到这个:

import System.IO
main = print =<< hGetBuffering stdout

在ghci中,您会看到NoBuffering,而在使用runghc时,您会看到LineBuffering。由于换行字符在用户输入之后才会打印,因此提示也不会。

通过在提示后添加hFlush stdout来修复它(或使用hSetBuffering stdout NoBuffering禁用缓冲,但这可能不好)。