This question already has answers here:
IO happens out of order when using getLine and putStr

(3个答案)


7年前关闭。




假设我们有一个简短的haskell程序:
main = do putStr "2 + 2 = "
          x <- readLn
          if x == 4
             then putStrLn "Correct"
             else putStrLn "Wrong"

它产生什么输出?



现在让我们再来一个:
main = do putStrLn "2 + 2 = "
          x <- readLn
          if x == 4
             then putStrLn "Correct"
             else putStrLn "Wrong"

那产生



用户输入粗体4的位置。

熟悉Haskell的人可以向我解释为什么吗?
我如何获得理想的结果,这是

最佳答案

行缓冲。在写入完整的文本行之前,不会“清除”输出缓冲区。

两种解决方案:

  • 手动刷新缓冲区。 (putStr后跟hFlush stdout。)
  • 关闭缓冲。 (hSetBuffering stdout NoBuffering。)
  • 09-28 08:51