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

QWR*_*WRp 38 io haskell buffering ghc

我有以下代码:

main = do
    putStr "Test input : "
    content <- getLine
    putStrLn content
Run Code Online (Sandbox Code Playgroud)

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

asd
Test input : asd
Run Code Online (Sandbox Code Playgroud)

为什么要Test input : asd在之后打印asd

在的代码示例http://learnyouahaskell.com/,它使用putStr,所述getLine的呈现输出比我的不同.当我使用putStrLn该程序按预期工作(打印,然后提示,并打印).

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

Jos*_*Lee 52

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

import System.IO
main = print =<< hGetBuffering stdout
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你可能需要`import System.IO`而不是`import IO` (3认同)