Haskell GHCi“;让我们它有什么作用?
如果有人能指出文件中关于“let”在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”(不带“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