last
我使用foldl1
and编写函数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。
谁能告诉我我的论点有什么问题?