【发布时间】:2015-11-19 09:25:33
【问题描述】:
在使用A tutorial on the universality and expressiveness of fold
深入研究fold 时,我发现使用foldr 对foldl 进行了惊人的定义:
-- I used one lambda function inside another only to improve reading
foldl :: (b -> a -> b) -> b -> [a] -> b
foldl f z xs = foldr (\x g -> (\a -> g (f a x))) id xs z
了解了怎么回事后,我想我什至可以用foldr来定义foldl',会是这样的:
foldl' :: (b -> a -> b) -> b -> [a] -> b
foldl' f z xs = foldr (\x g -> (\a -> let z' = a `f` x in z' `seq` g z')) id xs z
与此平行:
foldl' :: (b -> a -> b) -> b -> [a] -> b
foldl' f z (x:xs) = let z' = z `f` x
in seq z' $ foldl' f z' xs
foldl' _ z _ = z
在这样的简单情况下,它们似乎都在恒定空间中运行(而不是创建 thunk):
*Main> foldl' (+) 0 [1..1000000]
500000500000
我可以认为foldl' 的两个定义在性能方面是等效的吗?
【问题讨论】:
标签: performance haskell fold