Optimization Haskell:列出fusion,需要它在哪里?

Optimization Haskell:列出fusion,需要它在哪里?,optimization,haskell,lazy-evaluation,fusion,Optimization,Haskell,Lazy Evaluation,Fusion,假设我们有以下几点: l = map f (map g [1..100]) 我们要做的是: head l 因此,我们得到: head (map f (map g [1..100])) 现在,我们必须得到这个的第一个元素地图的定义如下: map f l = f (head l) : (map f (tail l)) 然后我们得到: f (head (map g [1..100])) 然后再次应用: f (g (head [1..100])) 导致 f (g 1) 由于懒惰,没有形成中

假设我们有以下几点:

l = map f (map g [1..100])
我们要做的是:

head l
因此,我们得到:

head (map f (map g [1..100]))
现在,我们必须得到这个的第一个元素<代码>地图的定义如下:

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'
案例中,编译器应该很容易意识到,仅仅重新计算上面的列表比存储列表要快。

映射
示例中,列表单元格被创建,然后立即被垃圾回收。使用列表融合时,不需要GC或thunk操作(两者都不是免费的)。

当中间数据结构昂贵时,融合的好处最大。当传递的结构是惰性的,并且以顺序方式访问时,结构可能相对便宜(列表就是这样)

  • 对于惰性结构,fusion消除了创建thunk的恒定因素,并立即对其进行垃圾收集
  • 对于严格的结构,熔合可以消除O(n)功
因此,对于严格的数组和类似的结构来说,最大的好处是。然而,由于数据局部性的增加,由于较少的中间结构被分配为thunk,所以即使融合惰性列表也是一种成功