У меня есть следующий код:Haskell IO порядок выполнения
import Control.Monad (unless)
import System.IO (isEOF, hFlush, stdout)
main :: IO()
main = unlessFinished $ do
putStr "$ "
hFlush stdout
getLine >>= putStrLn
main
where
unlessFinished action = isEOF >>= flip unless action
Когда я скомпилировать и запустить этот код, он отображает курсор в начале заготовки линии и только после того, как я ударил [Enter] его выходы $
и все, что я написал.
Казалось бы, что getLine
вызывается прежде, чем putStr "$ "
даже хотя IO
монадных гарантирует, что это действия, которые называются в порядке, они упорядочены в коде (или я так понимаю, что написано here). Так почему это работает неправильно?
Кстати, я на самом деле не верю, пока я не попробовал запустить код самостоятельно. Затем я сказал «whaaaaa ...?!» вслух в моем кабинете. Хорошая работа, перегоняя ваш вопрос в такую приятную, удобоваримую, удивительную форму! –
Спасибо. Это было удивительно и для меня. На самом деле я начинал считать, что это не «ошибка» Хаскелла, а какая-то другая ошибка ядра/терминала/ОС, о которой я раньше не знал. :) – Sventimir