当您在 GHCi 中键入表达式时expr,会发生以下情况:
- 表达式经过类型检查。如果出现错误,GHCi 会告诉您错误并放弃。
- 否则,say
expr被发现有 type t;GHC 尝试t匹配IO a.
- 如果成功,则执行类似
it <- expr, 然后 ifa是Show且不是的实例(),则执行print it。
- 如果它失败了,并且
t它本身是 的一个实例Show,GHCi 会执行类似于let it = exprthen的操作print it。
- 否则,它会抱怨。
本质上,您需要在 GHCi 提示符处运行 IO 操作并获取它们返回的值,以及使用纯值并查看您得到的值。这就是 GHCi 的行为方式的原因:如果您似乎正在使用 IO 操作,GHCi 会执行此操作,然后如果该操作的结果可以显示并且有趣(即不是()),那么它会显示结果给你。如果它无法向您显示结果,那没什么大不了的,因为您可能只是想运行 IO 操作;如果你想要结果,你会用<-. 另一方面,如果你的表达式看起来不是一个 IO 动作,GHCi 会计算它并显示给你,如果它不能显示,那么 GHCi 就不能做任何有用的事情(这次没有副作用) ,
在这种情况下,return "abc"类型检查为IO String, 并且String是 的一个实例Show,因此 GHCi 执行类似的操作
it <- return "abc"
print it
根据单子定律,这与做的完全一样
print "abc"
因此结果。