【发布时间】:2015-05-13 01:09:14
【问题描述】:
我是 Haskell 的新手,我在这里查看了这篇文章:Cartesian product of 2 lists in Haskell。
在答案中有这个sn-p的代码:
cartProd xs ys = [(x,y) | x <- xs, y <- ys]
这两个列表中的哪一个:
xs = [1,2,3]
ys = [4,5,6]
会产生
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]
如果我没有看到这个结果,我会认为它会返回
[(1,4),(2,5),(3,6)]
因为它会同时遍历两个列表。
但现在它 - 对于我更了解的编程语言 - 看起来像是用于遍历矩阵的双 for 循环:
for (int x = 1; x < 4; x++)
for(int y = 4; y < 7; y++)
//make tuple (x,y)
是什么导致列表推导以这种方式运行?
【问题讨论】:
-
首先,列表不是主动构造的,而是使用惰性求值...
-
您能详细说明一下吗?我在非常基本的层面上了解惰性评估,但还不知道它的功能。
-
嗯,列表不是“完全”生成的(实际上根本没有生成)。它只是存储“定义”,当你对第一个元素感兴趣时,它会计算第一个元素,并为剩余部分构造一个新的表达式,等等。因此你甚至可以定义无限长的列表。
-
好吧,我想我明白了,但这对为什么 x 保持不变而 y 增加有任何影响吗?
-
@AR7 惰性求值永远不会影响产生哪个值;所有终止的评估订单将产生相同的值。惰性求值的神奇之处在于,如果任何求值顺序终止,惰性求值也会终止。简而言之:不,惰性求值对为什么 x 保持不变而 y 增加没有影响。
标签: list haskell list-comprehension