Я хотел протестировать foldl vs foldr. Из того, что я видел, вы должны использовать foldl over foldr, когда когда-либо сможете из-за оптимизации рекурсии хвоста.
Это имеет смысл. Однако после запуска этого теста я смущен:
foldr (принимает команду 0,057 с при использовании команды времени):
a::a -> [a] -> [a]
a x = ([x] ++ )
main = putStrLn(show ( sum (foldr a [] [0.. 100000])))
foldl (принимает команду 0.089s при использовании команды времени):
b::[b] -> b -> [b]
b xs = ( ++ xs). (\y->[y])
main = putStrLn(show ( sum (foldl b [] [0.. 100000])))
Ясно, что этот пример тривиален, но я смущен тем, почему foldr избивает foldl. Разве это не должно быть ясным случаем, когда побеждает склад?