首页 文章

GHCi“让” - 它做了什么?

提问于
浏览
26

我很欣赏有人可以指出关于GHCi中“let”的内容的文档,或者说失败,有说服力地解释它:-) .

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

4 回答

  • 30

    在GHCi中编程时,您就像使用 do 语法在IO monad中编程一样,例如,您可以直接执行 IO 操作,或使用monadic绑定语法,如 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
    
  • 11

    这是documentation的相关部分 .

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

  • 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的答案有点正确,但它并不是真正发生在幕后的事情 - 否则,例如,什么都不会被打印出来 .

  • 4

    GHCI命令在IO monad中执行并使用do语法,因此适用于desugaring规则 . 来自Real World 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
    

相关问题