可以说我们有以下内容:
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/