Haskell - putStr vs putStrLn和指令顺序

Use*_*291 5 io haskell output

假设我们有一个简短的haskell程序:

main = do putStr "2 + 2 = "
          x <- readLn
          if x == 4
             then putStrLn "Correct"
             else putStrLn "Wrong"
Run Code Online (Sandbox Code Playgroud)

它产生了什么输出?

4

2 + 2 =正确

现在让我们有另一个:

main = do putStrLn "2 + 2 = "
          x <- readLn
          if x == 4
             then putStrLn "Correct"
             else putStrLn "Wrong"
Run Code Online (Sandbox Code Playgroud)

产生了

2 + 2 =

4

正确

其中粗体4是用户输入的.

任何熟悉Haskell的人都可以向我解释为什么会这样吗?我如何获得所需的结果,即

2 + 2 = 4

正确

Mat*_*hid 13

线缓冲.在写入完整的文本行之前,不会"刷新"输出缓冲区.

两种解决方案

  1. 手动刷新缓冲区.(putStr其次是hFlush stdout.)
  2. 关闭缓冲.(hSetBuffering stdout NoBuffering.)