Haskell GHCi“;让我们它有什么作用?

Haskell GHCi“;让我们它有什么作用?,haskell,ghci,let,Haskell,Ghci,Let,如果有人能指出文件中关于“let”在GHCi中的作用,或者如果没有,请令人信服地解释它,我将不胜感激 据我所知,“let”(不带“in”)本身不是Haskell语言的一部分,另一方面,它似乎也不是GHCi命令,因为它的前缀不是冒号。下面是该命令的相关部分 GHCI语句作为IO计算执行。因此,let与IO单子中的内容相同,您可以使用let绑定非IO表达式,在GHCi中编程时,您就像在IO单子中使用do语法编程一样,因此,例如,您可以直接执行IO操作,或者使用一元绑定语法,如rGHCI命令在IO-m

如果有人能指出文件中关于“let”在GHCi中的作用,或者如果没有,请令人信服地解释它,我将不胜感激


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

下面是该命令的相关部分


GHCI语句作为IO计算执行。因此,
let
IO
单子中的内容相同,您可以使用
let
绑定非IO表达式,在GHCi中编程时,您就像在IO单子中使用
do
语法编程一样,因此,例如,您可以直接执行
IO
操作,或者使用一元绑定语法,如
rGHCI命令在IO-monad中执行,并使用do语法,因此可以应用desugaring规则。从

翻译为:

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

有关代码详细信息的详细信息,请参阅中的以下注释:

--------------------------------------------------------------------------
                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中的类型检查STMT
这是在tcUserStmt中实施的宏伟计划
您键入的内容hscStmt返回的IO[HValue]
------------- ------------------------------------
让pat=expr==>让pat=expr作为回报[强制hvalx,强制hvaly,…]
绑定:[x,y,…]
pat expr>>=\pat->返回[强制HVal x,强制HVal y,…]
绑定:[x,y,…]
expr(IO类型)==>expr>=\it->return[强制hvalit]
[NB:结果未打印]绑定:[it]
expr(非IO类型,==>让它=expr打印它>>返回[强制HVal it]
结果(可显示)绑定:[it]
expr(非IO类型,
结果不可显示)==>错误
因此,GHCi提示符下的命令最多可以有三种效果:一些代码被计算,一些内容被打印,一些变量名被绑定。您的案例(注释中的第一个案例)绑定变量,但不打印


语法确实类似于do符号,因此@sinan的答案有点正确,但它并不是真正发生在引擎盖下的事情——否则,例如,什么也不会被打印出来。

这不仅仅是
IO()
,而是任何
IO
类型的
IO a
动作。好吧,这很有意义,并将GHCi let与Haskell let联系起来。。。在do中。
let
在do块中不带
in
是允许的,这与您给出的示例(参见)不同,该示例中,被删除的单词让我有一点不知所措。我还以为是德斯加雷。我不知道这是什么意思。好吧,这很有道理。谢谢你指向文档,我还没有找到。作为旁白,doc相当令人失望,因为它对let的解释是以理解单子为前提的。新用户几乎会立即遇到let,因为它经常出现在开始Haskell概念的教程中,但如果复制到Haskell源文件中,它就不起作用,并且假设理解monad的解释也不太有用。尽管如此,通过这里收集的答案,我至少看到了这些功能是如何结合在一起的。@Gwidman是的,我理解。您不能直接将您编写的ghci语句复制到hs文件中,并期望它们正常工作。当然,你可以做
main=do
。当ghci使用其
Show
实例打印语句的输出时,它可能不会总是像预期的那样工作。我很确定在这个阶段我不完全理解这些,但了解不应该从ghci学习到什么程度是非常有用的:-)。谢谢简短回答:
let
(在
中没有
)是Haskell语言的一部分,当它位于
do
块中时(在GHCi中编写类似于在
IO
monad中编写)。
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
--------------------------------------------------------------------------
                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