7

last我使用foldl1and编写函数foldr1

lastr :: [a] -> a
lastr = foldr1 (flip const)

lastl :: [a] -> a
lastl = foldl1 (flip const)

它们适用于短名单。但是当我尝试使用很长的列表 [1..10^8] 时,lastr 在 6.94 秒内返回解决方案,但 lastl 内存不足。

foldr1 和 foldl1 的定义是(据我了解)

foldr1 f [x] = x
foldr1 f (x:xs) = f x $ foldr1 f xs

foldl1 f [x] = x
foldl1 f (x:y:ys)=foldl1 f $ f x y : ys

从这些看,foldl1 似乎比 foldr1 使用更少的内存,因为 foldl1 需要保留一个表达式,f x1 $ f x2 $ f x3 $ f x4 $...而 foldl1 可以f x y每次都计算并将其存储为列表的头元素,而不是保持它直到它达到 10^8。

谁能告诉我我的论点有什么问题?

4

1 回答 1

19
于 2013-04-30T20:29:45.360 回答