30

如果有人可以指出有关“让”在 GHCi 中的作用的文档,或者如果失败,请令人信服地解释它,我将不胜感激。

据我所知,“let”(没有“in”)本身不是 Haskell 语言的一部分,另一方面,它似乎也不是 GHCi 命令,因为它没有以冒号为前缀.

4

4 回答 4

34

在 GHCi 中编程时,您就像在 IO monad 中使用do语法编程一样,因此例如您可以直接执行一个IO操作,或者使用r <- someIOFun.

let也是其中的一部分,do因此您也可以使用它。我认为它正在被脱糖let .. in <rest of the computation>,所以例如当你这样做时:

ghci> let a = 1
ghci> someFun
ghci> someFun2

就像是:

let a = 1 in
do someFun
   someFun2
于 2012-12-27T09:19:26.437 回答
12

这是文档的相关部分。

GHCI 语句作为 IO 计算执行。let与您在IO使用.let

于 2012-12-27T09:14:25.893 回答
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

所以 GHCi 提示符下的命令最多可以产生三种效果:一些代码被评估,一些东西被打印,一些变量名被绑定。您的案例(评论中的第一个案例)绑定变量,但不打印。

语法确实类似于 do-notation,所以@sinan 的回答有点正确,但它并不是真正发生的事情——否则,例如,不会打印任何内容。

于 2012-12-27T11:51:05.987 回答
4

GHCI 命令在 IO monad 中执行并使用 do 语法,因此适用脱糖规则。来自真实世界的 Haskell

doNotation4 =
    do let val1 = expr1
           val2 = expr2
           {- ... etc. -}
           valN = exprN
       act1
       act2
       {- ... etc. -}
       actN

翻译为:

translated4 =
    let val1 = expr1
        val2 = expr2
        {- ... etc. -}
        valN = exprN
    in do act1
          act2
          {- ... etc. -}
          actN
于 2012-12-27T09:20:29.910 回答