gpt4 book ai didi

haskell - 使用 putStr 和 getLine 的 IO 操作顺序错误

转载 作者:行者123 更新时间:2023-12-03 07:34:08 25 4
gpt4 key购买 nike

我有以下代码:

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

当我运行它(使用 runhaskell)或编译它(ghc 6.10.4)时,结果如下:

asd
Test input : asd

为什么测试输入:asdasd之后打印?

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

这是 ghc 中的错误,还是它应该工作的方式?

最佳答案

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

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

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

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

关于haskell - 使用 putStr 和 getLine 的 IO 操作顺序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com