以下是我试图理解的代码。
let triple = [ (a,b,c) | c <- [1..10], a <- [1..c], b <- [1..a], a^2 + b^2 == c^2]
我的问题是Haskell以哪种顺序评估每个表达式?
答案 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中,评估顺序不会影响结果(除了奇怪的角落)。
考虑列表推导的关键是考虑嵌套顺序,而不是评估顺序。列表理解中最左边的术语是最外层的术语。