初学者帮助理解Haskell List Comprehension语法

时间:2015-06-12 01:38:02

标签: haskell syntax

以下是我试图理解的代码。

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

我的问题是Haskell以哪种顺序评估每个表达式?

2 个答案:

答案 0 :(得分:6)

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

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之上实际上是一个相当简单的语法糖。如果您想了解有关它们如何解释的更多信息,您可能希望看一下。

答案 1 :(得分:5)

  

Haskell以哪种顺序评估每个表达式?

作为一般规则,这个问题的答案是

  

这不关你的事。

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

考虑列表推导的关键是考虑嵌套顺序,而不是评估顺序。列表理解中最左边的术语是最外层的术语。