Я играю с монадой IO и учусь использовать побочные эффекты в Haskell, и кажется, что я ошибся.
Рассмотрим следующий код:
main = do
putStr "test"
getLine
return ()
Насколько я понимаю, do
"склеивает" три монады ввода-вывода в одну. Я предполагаю, что они будут выполняться последовательно, т.е. сначала будет напечатано "тест", затем прочитана строка, а затем фиктивный return ()
выдаст ()
Однако, когда я запускаю скомпилированное приложение, оно всегда ожидает чтения строки перед печатью "test".
Изменение порядка putStr
/getLine
ничего не дает. «Развертывание» значения из монады IO, например:
main = do
_ <- putStr "test"
_ <- getLine
return ()
... также не меняет результат.
Что мне здесь не хватает? Как обеспечить порядок действий ввода-вывода?
import System.IO
в начало кода, а затем поставитьhSetBuffering stdout NoBuffering
передputStr "test"
. Я видел, как это привлекало многих людей (и меня, когда я впервые начал работать с Haskell). - person bheklilr   schedule 02.07.2015