GHCi"让" - 它做什么?

gwi*_*man 28 haskell let ghci

我很欣赏有人可以指出关于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)


Sat*_*vik 11

这是文档的相关部分.

GHCI语句作为IO计算执行.因此let,与IO使用时绑定非IO表达式的monad中的内容相同let.

  • 感谢您指向文档,我没有找到.作为旁注,该文档相当令人失望,因为它对let的解释有点以理解monad为前提.新用户几乎立即遇到,因为它经常出现在关于开始Haskell概念的教程中,但如果复制到haskell源文件则不起作用,并且假设理解monad的解释不太有用.尽管如此,通过这里的答案集合,我至少可以看到这些功能如何组合在一起. (4认同)

Joa*_*ner 9

有关更多代码详细信息,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的回答是正确的,但它并不是真正发生在幕后的事情 - 否则,例如,什么都不会被打印出来.