如何在 Haskell 中嵌套 let 语句?

Posted

技术标签:

【中文标题】如何在 Haskell 中嵌套 let 语句?【英文标题】:How to nest let statements in Haskell? 【发布时间】:2012-04-26 06:41:22 【问题描述】:

我正在尝试嵌套几个 let 语句,但我遇到了对我来说没有意义的语法错误。我对 Haskell 编程真的很陌生,所以我确定这是我不明白的事情(可能与间距有关)。我知道 let 和 in 必须在同一列。

为什么会这样:

aaa = let y = 1+2
          z = 4+6
      in y+z

工作得很好,而

aaa = let y = 1+2
          z = 4+6
          in let f = 3
                 e = 3
             in e+f

给我错误:“表达式中的语法错误(意外的 `=')”

【问题讨论】:

离题了,但是 let 表达式默认是递归绑定的,所以很少需要在 let 中嵌套 let。 John L 的意思是,你可以将内部和外部的 let 语句组合成一个语句。 对,我明白,这是出于教育目的。我试图在不参考手册的情况下弄清楚该语言是静态范围还是动态范围。 【参考方案1】:

在第二个示例中,z = ... 未与 y = ... 对齐。在let 块中,每个定义都必须对齐。

我怀疑您使用制表符缩进,并且将您的编辑器设置为将制表符显示为少于 8 个空格,使其看起来与您对齐。您应该将制表符替换为空格,并且最好将您的编辑器设置为将制表符扩展为空格,以避免将来出现此类问题。

【讨论】:

当我将代码复制到浏览器时,这种错位实际上是我的错,但您使用空格而不是制表符是对的。我有几个标签,它完全搞砸了一切。用空格替换它,它就像一个魅力,非常感谢! @Nico 我建议您恢复编辑,因此它与此答案中的解释相匹配,这样发现此问题的人就不会感到困惑。

以上是关于如何在 Haskell 中嵌套 let 语句?的主要内容,如果未能解决你的问题,请参考以下文章

在没有嵌套 let 的情况下在 Clojure 中绑定多个相关变量

是否有与 Haskell 'let' 等效的 Python

Haskell let-expression 中出现奇怪的类型错误——问题是啥?

如何格式化嵌套的多值绑定?

在 Haskell 中使用嵌套的 `where` 子句

在 Haskell 中重写嵌套 for 循环的好技术是啥?