可能重复:
库函数自行组合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
.
这是我经常在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
意味着"撰写一系列功能".
我有点希望它在前奏中:-).
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
归档时间: |
|
查看次数: |
26214 次 |
最近记录: |