如何将重复应用函数累积到值列表中?

时间:2015-08-27 22:51:43

标签: list haskell

如何将函数的连续应用累积到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一样工作。

3 个答案:

答案 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))))

等等......