Порядок выполнения с (>> =) не тот, который я ожидал - PullRequest
9 голосов
/ 02 декабря 2011

У меня есть серия сетевых запросов, каждый из которых занимает> 10 секунд.
Чтобы пользователь знал, что происходит, я даю обновления:

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

С GHCi это работает должным образом, но скомпилированный или с помощью runghc, «Downloading» не печатает, пока «DONE» не сделает.

Я переписал его с помощью (>> =) и (>>), но у меня возникла та же проблема.

Что происходит?

1 Ответ

16 голосов
/ 02 декабря 2011

Проблема здесь не в порядке выполнения. Операторы выполняются в том порядке, который вы ожидаете. Проблема в том, что из-за буферизации вы не видите результаты, как только они появляются.

В частности, терминал ввода-вывода по умолчанию имеет линейную буферизацию. Это означает, что никакой вывод не появится на экране, пока вы не напечатаете новую строку или не очистите буфер. Поэтому вам нужно либо сбросить выходной поток с помощью hFlush после выполнения putStr, либо изменить режим буферизации стандартного вывода с помощью hSetBuffering, чтобы не использовать буферизацию строки.

...