如果有人可以指出有关“让”在 GHCi 中的作用的文档,或者如果失败,请令人信服地解释它,我将不胜感激。
据我所知,“let”(没有“in”)本身不是 Haskell 语言的一部分,另一方面,它似乎也不是 GHCi 命令,因为它没有以冒号为前缀.
在 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
这是文档的相关部分。
GHCI 语句作为 IO 计算执行。let
与您在IO
使用.let
有关更多深入代码的详细信息,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 的回答有点正确,但它并不是真正发生的事情——否则,例如,不会打印任何内容。
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