这是我想要了解的代码.
let triple = [ (a,b,c) | c <- [1..10], a <- [1..c], b <- [1..a], a^2 + b^2 == c^2]
Run Code Online (Sandbox Code Playgroud)
我的问题是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
Run Code Online (Sandbox Code Playgroud)
除了它会延迟运行,因为任何消耗列表都要求元素.
列表推导在列表monad之上实际上是一个相当简单的语法糖.如果您想了解有关如何解释它们的更多信息,您可能希望查看它们.
Haskell以哪种顺序评估每个表达式?
作为一般规则,这个问题的答案是
这不关你的事.
担心评估内容的顺序并不是思考Haskell程序将做什么的正确方法.在Java中,这很重要,因为评估可能会产生副作用.在Haskell中,评估顺序不会影响结果(旁边的怪异角落).
考虑列表推导的关键是考虑嵌套顺序,而不是评估顺序.列表理解中最左边的术语是最外层的术语.