不使用 in 时 let 的范围是啥?
Posted
技术标签:
【中文标题】不使用 in 时 let 的范围是啥?【英文标题】:What is the scope of let when used without in?不使用 in 时 let 的范围是什么? 【发布时间】:2012-04-04 08:45:43 【问题描述】:在 Haskell 教程中,我遇到了以下代码:
do [...]
let atom = [first] ++ rest
return $ case atom of
请注意,let
表达式没有 in
块。这样的let
表达式的范围是什么?下一行?
【问题讨论】:
[first] ++ rest
也很奇怪,应该是first : rest
【参考方案1】:
范围是do
块的其余部分。
See §3.14 of the Haskell Report(特别是翻译块中的第四种情况)。 (是的,这是关于 do
块的部分,因为没有 in
的 let
仅在 do
块内有效,正如 Porges 指出的那样。)
【讨论】:
还要注意,没有in
的let
仅在do
块内有效。【参考方案2】:
简单地说,它的范围是“从写入位置到do
结束”。
请注意,在 do
语句中,let
的处理方式不同。
根据http://www.haskell.org/haskellwiki/Monads_as_computation#Do_notation,解释如下:
do let <decls> ; <stmts>
= let <decls> in do <stmts>
【讨论】:
以上是关于不使用 in 时 let 的范围是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 if 语句块中使用 let 定义尚未定义的变量的替代方法是啥?