我正在玩 IO monad 并学习在 Haskell 中利用副作用,似乎我弄错了。
考虑以下代码:
main = do
putStr "test"
getLine
return ()
我在这里的理解是do
将三个 IO 单子“粘合”成一个。我的假设是它们将按顺序执行,即“test”将首先打印,然后 line read,然后 dummyreturn ()
将产生()
但是,当我运行已编译的应用程序时,它总是在打印“测试”之前等待读取行。
重新排序putStr
/getLine
没有任何作用。来自 IO monad 的“展开”值,如下所示:
main = do
_ <- putStr "test"
_ <- getLine
return ()
...也不会改变结果。
我在这里想念什么?如何强制执行 IO 操作的顺序?