我很欣赏有人可以指出关于GHCi中"let"做什么的文档,或者说失败,有说服力地解释它:-).
据我所知,"let"(没有"in")本身不是Haskell语言的一部分,另一方面,它似乎也不是GHCI命令,因为它没有以冒号为前缀.
sin*_*nan 31
在GHCi中编程时,您就像使用do语法在IO monad中编程一样,例如,您可以直接执行IO操作,或使用monadic绑定语法r <- someIOFun.
let也是一部分,do所以你也可以使用它.我认为它正在被淘汰let .. in <rest of the computation>,所以例如当你这样做时:
ghci> let a = 1
ghci> someFun
ghci> someFun2
Run Code Online (Sandbox Code Playgroud)
就像是:
let a = 1 in
do someFun
someFun2
Run Code Online (Sandbox Code Playgroud)
有关更多代码详细信息,TcRnDriver.lhs中的此注释可能会很有用:
--------------------------------------------------------------------------
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
Run Code Online (Sandbox Code Playgroud)
因此GHCi提示符下的命令最多可以有三个效果:一些代码被评估,一些东西被打印,一些变量名称被绑定.您的案例(评论中的第一个)绑定变量,但不打印.
语法确实类似于do-notation,所以@sinan的回答是正确的,但它并不是真正发生在幕后的事情 - 否则,例如,什么都不会被打印出来.
| 归档时间: |
|
| 查看次数: |
3821 次 |
| 最近记录: |