Монада IO и порядок

Я играю с монадой IO и учусь использовать побочные эффекты в Haskell, и кажется, что я ошибся.

Рассмотрим следующий код:

main = do
    putStr "test"
    getLine
    return ()

Насколько я понимаю, do "склеивает" три монады ввода-вывода в одну. Я предполагаю, что они будут выполняться последовательно, т.е. сначала будет напечатано "тест", затем прочитана строка, а затем фиктивный return () выдаст ()

Однако, когда я запускаю скомпилированное приложение, оно всегда ожидает чтения строки перед печатью "test".

Изменение порядка putStr/getLine ничего не дает. «Развертывание» значения из монады IO, например:

main = do
    _ <- putStr "test"
    _ <- getLine
    return ()

... также не меняет результат.

Что мне здесь не хватает? Как обеспечить порядок действий ввода-вывода?


person Eugene Loy    schedule 02.07.2015    source источник
comment
Вероятно, это связано с буферизацией строк по умолчанию для Haskell. Попробуйте добавить import System.IO в начало кода, а затем поставить hSetBuffering stdout NoBuffering перед putStr "test". Я видел, как это привлекало многих людей (и меня, когда я впервые начал работать с Haskell).   -  person bheklilr    schedule 02.07.2015
comment
@bheklilr это сработало, спасибо. Пожалуйста, опубликуйте это как ответ, чтобы я мог его принять.   -  person Eugene Loy    schedule 02.07.2015
comment
Я просто указал на очень похожий вопрос, на который уже есть хороший принятый ответ с более подробной информацией, которую я, вероятно, поместил бы здесь.   -  person bheklilr    schedule 02.07.2015