我正在玩IO monad并学习如何利用Haskell中的副作用,似乎我弄错了。
请考虑以下代码:
main = do
putStr "test"
getLine
return ()
我的理解是do
"胶水"三个IO monads合二为一。我的假设是它们将按顺序执行,即" test"将首先打印,然后行读取,然后虚拟return ()
将生成()
但是,当我运行已编译的应用程序时,它始终等待在打印之前读取" test"。
重新排序putStr
/ getLine
并非如此。 "解缠"来自IO monad的价值,如下:
main = do
_ <- putStr "test"
_ <- getLine
return ()
...也不会改变结果。
我在这里缺少什么?如何强制执行IO操作的命令?