使用 putStr 和 getLine 的 IO 操作顺序错误
我有以下代码:
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/ 上使用 putStr
的代码示例中, getLine
呈现的输出与我的不同。当我使用 putStrLn 时,程序按预期工作(打印,然后提示,然后打印)。
这是 ghc 中的错误,还是它应该工作的方式?
I have the following code:
main = do
putStr "Test input : "
content <- getLine
putStrLn content
When I run it (with runhaskell
) or compile it (ghc 6.10.4) the result is like this:
asd
Test input : asd
Why is Test input : asd
being printed after asd
?
In the code sample on http://learnyouahaskell.com/, which uses putStr
, the getLine
's presented output is different than mine. When I use putStrLn
the program works as expected (print, then prompt, and print).
Is it a bug in ghc
, or it is the way that it should work?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是因为 ghci 禁用了缓冲,而使用 ghc 编译的程序默认具有行缓冲。您可以通过运行以下命令看到这一点:
在 ghci 中,您会看到
NoBuffering
,而在 runghc 中,您会看到LineBuffering
。由于换行符只有在用户输入之后才会打印,因此提示也不会打印。通过在提示后添加
hFlush stdout
来修复它(或者使用hSetBuffering stdout NoBuffering
禁用缓冲,但这可能很糟糕)。This is because ghci disables buffering, while a program compiled with ghc has line buffering by default. You can see this by running this:
In ghci you see
NoBuffering
while with runghc you getLineBuffering
. Since the newline character doesn't print until after the user input, the prompt doesn't either.Fix it by adding
hFlush stdout
after your prompt (or disable buffering withhSetBuffering stdout NoBuffering
, but that’s probably bad).