如何在'n'次调用相同的函数?

时间:2011-09-14 21:21:13

标签: haskell

  

可能重复:
  Library function to compose a function with itself n times

我需要一个函数来多次调用另一个函数。

所以它看起来像这样 f n = g(g(g(g(l)))) 其中n等于嵌套的函数g的数量。

我应该怎么做呢?谢谢!

4 个答案:

答案 0 :(得分:62)

iterate是一种常见的解决方案:

> :t iterate
iterate :: (a -> a) -> a -> [a]

因此,给定一个域与其范围a -> a和初始输入a相同的函数,在表单中生成无限的结果列表:

iterate f a --> [a, f(a), f(f(a)), ...]

您可以使用!!访问列表的第n个元素:

iterate f a !! n

NB iterate f a !! 0 == a

答案 1 :(得分:8)

这是我经常在ghci提示符下使用的函数。有几种方法可以写它,但我不是特别喜欢它们,但它们都很合理:

fpow n f x = iterate f x !! n

fpow n f = foldr (.) id $ replicate n f

fpow n = foldr (.) id . replicate n   -- just eta the above

fpow 0 f = id
fpow n f = f . fpow (n-1) f

中间两个人对我很有吸引力,因为我的大脑已经将foldr (.) id表示为“组成一系列功能”。

我只是希望它在前奏中: - )。

答案 2 :(得分:6)

f 0 = l
f n = g (f (n-1))

但更多功能将是:

f 0 l = l
f n l = g (f (n-1) l)

这也可以通过折叠或摩擦来完成,但这更容易理解。

例如,这里使用了一个hylomorphism,但它并没有让它更清晰:

f g l = hylo l (.) (\n -> (g, n-1)) (==0)

它说有些像compose(。)g(l)直到n == 0

答案 3 :(得分:4)

可以使用fold:

完成
applyNTimes :: Int -> (a -> a) -> a -> a
applyNTimes n f val = foldl (\s e -> e s) val [f | x <- [1..n]]