我正在学习Haskell和IO monad。我想知道为什么这个程序不会强制输出"hi"以及"bye":
second a b = b
main = print ((second $! ((print "hi") >>= (\r -> return ()))) "bye")
据我理解,$!
运算符会强制对 second
的第一个参数求值,而>>=
运算符需要运行 print "hi"
才能将其值传递给 \r -> return ()
,它将在屏幕上打印“hi”。我的推理有什么问题吗?另外,除了使用不安全的函数之外,是否有任何方法可以证明Haskell不能被欺骗,在“安全”的代码中运行IO操作?
main = print (print "hi" \
seq` "bye")`。请注意,我的翻译保留了原始意思但可能会更通俗易懂。 - Joachim Breitner($!)
使用了seq
,这已经让许多开发人员陷入困境,例如参见GHC问题#5129,其中ezyang提出了另一个有问题的seq
使用;它提供了更多关于为什么你的代码示例在Haskell 2010中无法工作的细节。 - atravers