初学者帮助理解 Haskell 列表理解语法

Beginner help for understanding Haskell List Comprehension syntax

这是我试图理解的代码。

let triple = [ (a,b,c) | c <- [1..10], a <- [1..c], b <- [1..a], a^2 + b^2 == c^2]

我的问题是 Haskell 计算每个表达式的顺序是什么?

您可以粗略地将其转换为命令式伪代码,如下所示:

for c in 1..10
  for a in 1..c
    for b in 1..a
      if a^2 + b^2 == c^2
        put (a,b,c) on end of triple

除了它会 运行 懒惰地,因为任何消耗列表的元素都会被请求。

列表理解实际上是列表 monad 顶部的一个相当简单的语法糖。如果您想了解有关如何解释它们的更多信息,您可能想看看那里。

In which order does Haskell evaluate each expression?

一般来说,这个问题的答案是

It's none of your business.

担心事物的评估顺序并不是考虑 Haskell 程序将做什么的正确方法。在 Java 中,这很重要,因为评估可能有副作用。在 Haskell 中,评估顺序不影响结果(除了奇怪的角落)。

考虑列表理解的关键是考虑嵌套顺序,而不是求值顺序。列表理解的最左边的术语是最外层的。