我有以下代码:
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
monad 保证它的 Action 按照它们在代码中的顺序被调用(或者我理解写的是什么 here )。那么为什么它不能正常工作呢?
最佳答案
实际上,putStr
和 hFlush
在 getLine
之前正在执行操作行动——然而,isEOF
在任一之前被执行,直到它知道输入是否为 EOF
才返回。或者不,也就是说,直到您输入一行。您可能会考虑移动 isEOF
就在 getLine
之前, 像这样:
main :: IO ()
main = do
putStr "$ "
hFlush stdout
unlessFinished $ do
getLine >>= putStrLn
main
where
unlessFinished action = isEOF >>= flip unless action
关于Haskell IO 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34009127/