--------------------------------------------------------------------------
Typechecking Stmts in GHCi
Here is the grand plan, implemented in tcUserStmt
What you type The IO [HValue] that hscStmt returns
------------- ------------------------------------
let pat = expr ==> let pat = expr in return [coerce HVal x, coerce HVal y, ...]
bindings: [x,y,...]
pat <- expr ==> expr >>= \ pat -> return [coerce HVal x, coerce HVal y, ...]
bindings: [x,y,...]
expr (of IO type) ==> expr >>= \ it -> return [coerce HVal it]
[NB: result not printed] bindings: [it]
expr (of non-IO type, ==> let it = expr in print it >> return [coerce HVal it]
result showable) bindings: [it]
expr (of non-IO type,
result not showable) ==> error
4 回答
在GHCi中编程时,您就像使用
do
语法在IO monad中编程一样,例如,您可以直接执行IO
操作,或使用monadic绑定语法,如r <- someIOFun
.let
也是do
的一部分,所以你也可以使用它 . 我认为它正在被淘汰到let .. in <rest of the computation>
,所以例如当你这样做时:就像是:
这是documentation的相关部分 .
GHCI语句作为IO计算执行 . 因此
let
与IO
monad中的内容相同,其中使用let
绑定非IO表达式 .有关更多代码详细信息,TcRnDriver.lhs中的此评论可能会很有用:
因此,GHCi提示符下的命令最多可以有三种效果:一些代码被评估,一些东西被打印,一些变量名称被绑定 . 您的案例(评论中的第一个)绑定变量,但不打印 .
语法确实类似于do-notation,所以@ sinan的答案有点正确,但它并不是真正发生在幕后的事情 - 否则,例如,什么都不会被打印出来 .
GHCI命令在IO monad中执行并使用do语法,因此适用于desugaring规则 . 来自Real World Haskell
翻译为: