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を使用しないように stdout のバッファリング モードを変更する必要があります。hSetBuffering

于 2011-12-02T19:29:50.033 に答える