Sve*_*mir 5 io haskell order-of-execution
我有以下代码:
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
Run Code Online (Sandbox Code Playgroud)
当我编译并运行这段代码时,它会在空白行的开头显示一个光标,并且只有在我按下[Enter]后输出它$和我写的任何内容.
即使monad保证它的动作按照它们在代码中排序的顺序被调用(或者我理解这里写的是什么),它似乎也会getLine被调用.那为什么它不能正常工作?putStr "$ "IO
其实,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |