【发布时间】:2012-04-04 08:45:43
【问题描述】:
在 Haskell 教程中,我遇到了以下代码:
do [...]
let atom = [first] ++ rest
return $ case atom of
请注意,let 表达式没有 in 块。这样的let 表达式的范围是什么?下一行?
【问题讨论】:
-
[first] ++ rest也很奇怪,应该是first : rest
在 Haskell 教程中,我遇到了以下代码:
do [...]
let atom = [first] ++ rest
return $ case atom of
请注意,let 表达式没有 in 块。这样的let 表达式的范围是什么?下一行?
【问题讨论】:
[first] ++ rest 也很奇怪,应该是first : rest
范围是do 块的其余部分。
See §3.14 of the Haskell Report(特别是翻译块中的第四种情况)。 (是的,这是关于 do 块的部分,因为没有 in 的 let 仅在 do 块内有效,正如 Porges 指出的那样。)
【讨论】:
in 的let 仅在do 块内有效。
简单地说,它的范围是“从写入位置到do 结束”。
请注意,在 do 语句中,let 的处理方式不同。
根据http://www.haskell.org/haskellwiki/Monads_as_computation#Do_notation,解释如下:
do { let <decls> ; <stmts> }
= let <decls> in do { <stmts> }
【讨论】: