当您在 GHCi 中键入表达式时expr
,会发生以下情况:
- 表达式经过类型检查。如果出现错误,GHCi 会告诉您错误并放弃。
- 否则,say
expr
被发现有 type t
;GHC 尝试t
匹配IO a
.
- 如果成功,则执行类似
it <- expr
, 然后 ifa
是Show
且不是的实例()
,则执行print it
。
- 如果它失败了,并且
t
它本身是 的一个实例Show
,GHCi 会执行类似于let it = expr
then的操作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"
因此结果。