我只是在学习Haskell和IO monads.我想知道为什么这不会强制程序输出"hi"以及"bye":
second a b = b
main = print ((second $! ((print "hi") >>= (\r -> return ()))) "bye")
Run Code Online (Sandbox Code Playgroud)
据我所知,$!
运算符会强制要求第一个参数second
进行求值,并且>>=
运算符需要运行print "hi"
以便从中获取值并将其传递\r -> return ()
给屏幕,这将打印"hi"到屏幕.
我的推理有什么问题?
而且,有没有办法证明Haskell不能被欺骗(除了使用不安全的函数)在"安全"代码中运行IO操作?