不使用 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 块的部分,因为没有 inlet 仅在 do 块内有效,正如 Porges 指出的那样。)

【讨论】:

还要注意,没有inlet 仅在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 的范围是啥?的主要内容,如果未能解决你的问题,请参考以下文章

链接“let”语句时最好使用“and”或“in”?

prog vs. let in LISP 性能差异

在 if 语句块中使用 let 定义尚未定义的变量的替代方法是啥?

在 OCaml 中的 let 命令(即 let _ = ... in)中使用下划线通配符有啥副作用吗?

Haskell 中的“让”和“进入”是啥意思?

使用范围时“TypeError:'float'对象不能解释为整数”是啥意思?