我想测试折叠对折叠。从我所看到的,由于尾部递归优化,您应该尽可能使用 foldl over foldr。
这是有道理的,但是,在运行了这个测试之后,我感到很困惑:
Foldr (使用 time 命令时需要0.057秒) :
a::a -> [a] -> [a]
a x = ([x] ++ )
main = putStrLn(show ( sum (foldr a [] [0.. 100000])))
Foldl (使用 time 命令时需要0.089秒) :
b::[b] -> b -> [b]
b xs = ( ++ xs). (\y->[y])
main = putStrLn(show ( sum (foldl b [] [0.. 100000])))
很明显,这个示例是微不足道的,但是我不明白为什么 foldr 要击败 foldl。这难道不应该是一个折叠赢得明确的情况吗?