带有(>> =)的执行顺序不是我的预期

时间:2011-12-02 19:26:30

标签: haskell monads do-notation

我收到了一系列网络请求,每次请求大于10秒 为了让用户知道发生了什么,我给出了更新:

main = do putStr "Downloading the first thing... "
          {- Net request -}
          putStrLn "DONE"
          putStr "Downloading the second thing... "
          {- Net request -}
          putStrLn "DONE"

使用GHCi,这可以按预期工作,但是编译或使用runghc,“下载”不会打印直到“完成”。

我用(>> =)和(>>)重写了它,但我遇到了同样的问题。

发生了什么事?

1 个答案:

答案 0 :(得分:16)

这里的问题不在于执行顺序。语句按照您期望的顺序执行。问题在于,由于缓冲,您实际上不会在结果发生时立即看到结果。

默认情况下,终端IO是行缓冲的。这意味着在打印换行符或刷新缓冲区之前,屏幕上不会显示任何输出。因此,您需要在执行putStr后使用hFlush刷新'输出流,或者您需要使用hSetBuffering更改stdout的缓冲模式以不使用行缓冲。