假设我们有以下内容:
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'
上面的例子中,编译器意识到重新计算上面的列表而不是存储它应该是相当简单的。