可以说我们有以下内容:

l = map f (map g [1..100])

我们要做的是:
head l

这样我们得到:
head (map f (map g [1..100]))

现在,我们必须先了解这一点。 map的定义如下:
map f l = f (head l) : (map f (tail l))

这样我们得到:
f (head (map g [1..100]))

然后再次应用:
f (g (head [1..100]))

导致
f (g 1)

只是由于懒惰而没有形成中间列表。

这种分析正确吗?像这样的简单结构:
foldl' ... $ map f1 $ map f2 $ createlist

是否创建了中间列表,即使没有“列表融合”也是如此? (我认为懒惰应该轻而易举地消除它们)。

我唯一看到保留列表的原因是:
l' = [1..100]
l = map f (map g l')

如果在其他地方使用了l',我们可能希望保留它。但是,在上面的l'情况下,对于编译器来说,重新计算上面的列表而不是存储上面的列表,要更快地实现它应该是微不足道的。

最佳答案

map示例中,将创建列表单元,然后立即对其进行垃圾回收。使用列表融合,不需要GC或thunk操作(它们都不是免费的)。

关于optimization - Haskell:列表融合,在哪里需要?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10945429/

10-11 22:35
查看更多