我只是在学习 Haskell 和 IO 单子。我想知道为什么不强制程序输出“hi”和“bye”:
second a b = b
main = print ((second $! ((print "hi") >>= (\r -> return ()))) "bye")
据我了解,$!
操作员将强制计算的第一个参数second
,并且>>=
操作员需要运行print "hi"
才能从中获取一个值并将其传递给\r -> return ()
,这将在屏幕上打印“hi”。
我的推理有什么问题?
而且,有没有办法证明 Haskell 不能被欺骗(除了使用不安全的函数)在“安全”代码中运行 IO 操作?