GHCI“让” - 它有什么作用?(GHCi “let” — what does it do?)

2019-07-17 14:40发布

我欣赏的是有人可能指向文档是什么“让”确实在GHCI,或做不到这一点,解释令人信服:-)。

到目前为止,我所知道的,“让”(没有“中”)不是Haskell语言本身的一部分,而在另一方面,它似乎并没有成为一个GHCI命令要么,因为它不是由冒号前缀。

Answer 1:

虽然在ghci中编程,你喜欢与IO单子编程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


Answer 2:

下面是相关的部分文件 。

GHCI语句作为IO计算执行。 所以, let是一样的,你有一个里面是什么IO ,你用结合非IO表达单子let



Answer 3:

欲了解更多下来到该代码的细节,在此评论TcRnDriver.lhs可能enlighting:

--------------------------------------------------------------------------
                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-符号,所以@思南的答案有些正确的,但它是不是真的什么是引擎盖下发生 - 否则,例如,将永远被打印什么。



Answer 4:

GHCI命令在IO单子执行和使用做语法,所以脱糖规则。 从真实世界哈斯克尔

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


文章来源: GHCi “let” — what does it do?
标签: haskell ghci let