可能重复:
Library function to compose a function with itself n times
我需要一个函数来多次调用另一个函数。
所以它看起来像这样 f n = g(g(g(g(l)))) 其中n等于嵌套的函数g的数量。
我应该怎么做呢?谢谢!
答案 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]]