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

phx*_*xxx 24 haskell

可能重复:
库函数自行组合n次函数

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

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

我应该怎么做呢?谢谢!

Tho*_*son 63

iterate 是一种常见的解决方案

> :t iterate
iterate :: (a -> a) -> a -> [a]
Run Code Online (Sandbox Code Playgroud)

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

iterate f a --> [a, f(a), f(f(a)), ...]
Run Code Online (Sandbox Code Playgroud)

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

iterate f a !! n
Run Code Online (Sandbox Code Playgroud)

NB iterate f a !! 0 == a.

  • 一旦你逼迫右手,懒惰的评价就会爱你. (24认同)
  • 天哪,我喜欢懒惰的评价. (9认同)
  • 最好的单线摘要永远的懒惰评价的恩惠和困境. (3认同)
  • `take n $ iterate fa`也有效 (3认同)

luq*_*qui 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
Run Code Online (Sandbox Code Playgroud)

中间的两个吸引我,因为我的大脑已经foldr (.) id意味着"撰写一系列功能".

我有点希望它在前奏中:-).


nul*_*nge 6

f 0 = l
f n = g (f (n-1))
Run Code Online (Sandbox Code Playgroud)

但更多功能将是:

f 0 l = l
f n l = g (f (n-1) l)
Run Code Online (Sandbox Code Playgroud)

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

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

f g l = hylo l (.) (\n -> (g, n-1)) (==0)
Run Code Online (Sandbox Code Playgroud)

它说有些东西就像compose(.)g(l)直到n == 0