列表理解评估
我不明白为什么下面两种情况会有所不同?因为懒惰评估?
1)
Main> [x:xs | x:xs <- tails [1,2,3]]
=> [[1,2,3], [2,3], [3]]
2)
Main> [x:xs | x:xs' <- tails [1,2,3], x':xs <- tails [1,2,3]]
=> [[1,2,3],[1,3],[1], [2,2,3],[2,3],[2],[3,2,3],[3,3],[3]]
I don't understand why below 2 case be different ? because of lazy evaluation?
1)
Main> [x:xs | x:xs <- tails [1,2,3]]
=> [[1,2,3], [2,3], [3]]
2)
Main> [x:xs | x:xs' <- tails [1,2,3], x':xs <- tails [1,2,3]]
=> [[1,2,3],[1,3],[1], [2,2,3],[2,3],[2],[3,2,3],[3,3],[3]]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
它们的定义不同。展示这一点的最好方法是举一个例子。列表推导式试图找到所有可能的变量集,这些变量可以从列表中选择而不违反条件。如果您有多个变量,它将返回它们的每一种组合。例如:
收益率:
我们能看到什么?首先,选择第一个列表中的一个元素,而不是第二个列表中的一个元素。结果是选择 x 和 y 的所有可能方式的列表。
所以你的第二个语句当然必须产生第二个结果。
They are different by definition. The best way to show this, is an example. List comprehensions try to find all possible sets of variables, that can be choosed from the list without violating the condition. If you have more than one variable, it returns each combination of them. For instance:
yields:
What can we see? First, an element of the first list is chosen, than one of the second list. The result is a list of all possible ways of choosing x and y.
SO your second statement must of course yield the second result.
不,与惰性评估无关。
考虑第三种情况:
No, nothing to do with lazy evaluation.
Consider this third case:
另一种看待它的方式:
您的第一个理解将
x
和xs
绘制为“对”,有点将它们“压缩”在一起。您的第二个推导式绘制了
x
和xs
的所有组合,并将它们与(:)
组合起来。Another way to look at it:
Your first comprehension draws
x
andxs
as a "pair", sort of keeping them "zipped" together.Your second comprehension draws all combinations of
x
andxs
, combining them with(:)
.