Haskell - putStr vs putStrLn和指令顺序

时间:2014-02-18 09:04:00

标签: haskell io output

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

main = do putStr "2 + 2 = "
          x <- readLn
          if x == 4
             then putStrLn "Correct"
             else putStrLn "Wrong"

它产生了什么输出?

  

4

     

2 + 2 =正确

现在让我们来看另一个:

main = do putStrLn "2 + 2 = "
          x <- readLn
          if x == 4
             then putStrLn "Correct"
             else putStrLn "Wrong"

生成

  

2 + 2 =

     

4

     

正确

粗体4是用户输入的。

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

  

2 + 2 = 4

     

正确

1 个答案:

答案 0 :(得分:12)

线缓冲。在写完整行文本之前,输出缓冲区不会被“刷新”。

两种解决方案:

  1. 手动清除缓冲区。 (putStr后跟hFlush stdout。)
  2. 关闭缓冲。 (hSetBuffering stdout NoBuffering。)