我想验证foldl的以下实现,以及foldr是正确的:
foldl4 = foldr . flip
我在HUGS中使用了以下测试:
foldl4 (+) 3 [] foldl4 (+) 3 [1,2,3]
他们工作.
请建议我可以做的更多测试.
谢谢
这是一个简单的测试:foldl (flip (:)) []
应该reverse
......
如果你想测试foldr
vs foldl
你可能不应该使用交换操作;)
这是GHCi的一些证据:
?> foldl (flip (:)) [] [1..5] [5,4,3,2,1] ?> foldl4 (flip (:)) [] [1..5] [1,2,3,4,5]
并且flip (+) = (+)
你可以从你的定义直猜想:
foldl4 (+) y xs { def } = foldr (flip (+)) y xs { flip (+) = (+) } = foldr (+) y xs
如果你想要一些提示怎么办foldl
用foldr
:你应该使用功能对蓄电池/国家/ B的一部分foldr :: (a -> b -> b) -> b -> [a] -> b
-想延续传球和尝试更换:
在
x : (y : (z : [])
有一些聪明的功能得到
((b `f` x) `f` y) `f` z
记得你想模仿
foldl f b [x,y,z] = ((b `f` x) `f` y) `f` z
与foldr
这基本上取代了:
它的第一个参数,并[]
与它的第二,如果你传递[x,y,z]
的第三个:
foldr f' b' [x,y,z] = x `f'` (y `f'` (z `f'` b'))
而你现在想要转移parens