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)功李>