如何将函数的连续应用累积到Haskell中的值列表?
我不确定我是否正确,但我正在寻找的是,我的列表值为X
,
l = [a, b, c, d, e]
和一个功能
f :: X -> X -> X
我想要
(f e (f d (f c (f b a))))
我认为也许可以用某种方式用$
来表达。
我看到Haskell有一些fold
函数,但我无法弄清楚如何让它像fold operations I'm familiar with一样工作。
答案 0 :(得分:6)
这不仅仅是foldl1 (flip f) l
吗?您想要左折,并且您希望操作以列表中的第一项而不是特定累加器开始。
答案 1 :(得分:5)
嗯,你的函数f
确实有类型:
f :: X -> X -> X
然后你感兴趣的表达是:
foldr1 f [e, d, c, a, b] -- note the twist at the end.
如果你想计算:
f e (f d (f c (f b a))) -- note last term is: f b a
那就是:
foldr1 f [e, d, c, b, a]
答案 2 :(得分:4)
使用simple-reflect
进行游戏以解决问题。
ghci> import Debug.SimpleReflect
ghci> foldl1 f [a,b,c,d,e]
f (f (f (f a b) c) d) e
ghci> foldl (flip f) z [a,b,c,d,e]
f e (f d (f c (f b (f a z))))
等等......