【发布时间】:2012-06-08 08:28:38
【问题描述】:
假设我们有以下内容:
l = map f (map g [1..100])
我们想做的事:
head l
所以我们得到:
head (map f (map g [1..100]))
现在,我们必须获取 this 的第一个元素。 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' 案例中,编译器应该很容易意识到重新计算上面的列表比存储它更快。
【问题讨论】:
标签: optimization haskell lazy-evaluation fusion