9

我有一系列网络请求,每个请求都需要 >10 秒。
为了让用户知道发生了什么,我提供了更新:

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

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

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

这是怎么回事?

4

1 回答 1

16

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

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

于 2011-12-02T19:29:50.033 回答