我有以下代码:
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]后,它才输出
$
和我写的任何内容。似乎在调用
putStr "$ "
之前调用了getLine
,尽管IO
单子保证其操作按照代码中顺序连续调用(或者我理解的是这里所写的)。那么为什么它不能正确工作呢?