41

我有以下代码:

main = do
    putStr "Test input : "
    content <- getLine
    putStrLn content

当我运行它(使用runhaskell)或编译它(ghc 6.10.4)时,结果是这样的:

asd
Test input : asd

为什么Test input : asd被打印后asd

http://learnyouahaskell.com/上的代码示例中,它使用putStrgetLine呈现的输出与我的不同。当我使用putStrLn程序按预期工作时(打印,然后提示,然后打印)。

它是一个错误ghc,还是它应该工作的方式?

4

1 回答 1

55

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

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

在 ghci 中你会看到NoBufferingrunghc 你得到LineBuffering. 由于换行符直到用户输入才会打印,因此提示也不会。

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

于 2010-03-23T14:09:48.457 回答