Haskell中是否有一个库函数可以自己编写一个函数n次?
例如,我有这个功能:
func :: a -> a
Run Code Online (Sandbox Code Playgroud)
我想这样做:
func . func . func . func . func . func , ...
Run Code Online (Sandbox Code Playgroud)
(最多n次,其中n仅在运行时已知).
请注意,迭代函数不适合我正在做的事情,因为我不关心任何中间结果.
Rei*_*ton 54
该iterate
解决方案是好的,否则你可能会喜欢这一个:的组成n
的副本f
是foldr (.) id (replicate n f)
.
Tho*_*son 24
\xs n -> iterate func xs !! n
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但我觉得xs
在学习Haskell时人们并没有经常接触到这些东西.
如果您不喜欢,n
那么您可以使用func
并iterate
作为替代方案.(某些人/群组/工具不喜欢在某些情况下调用"错误"的函数,我并不认为在这些情况下查找更好)
lookup n . zip [0..] . iterate func
Run Code Online (Sandbox Code Playgroud)
编辑:好的,所以我删除,则未删除,因为我与其他回答者同意-你不应该使用折扣迭代的,只是因为它给你更多的比你的需要.
Tsu*_*Ito 12
我不知道你为什么说iterate
不合适.它非常适合这个目的. (!! n) . iterate func
是n
复制品的组成func
.
(有人发布了类似上面代码的答案,但他/她似乎已将其删除了.)
我是Haskell的初学者,目前在第5章("高阶函数")中学习你是一个很好的Haskell!所以我还不熟悉之前回复中显示的功能.根据我到目前为止的理解,我会这样做:
applyNTimes :: Int -> (a -> a) -> a -> a
applyNTimes n f x
| n == 0 = x
| otherwise = f (applyNTimes (n-1) f x)
Run Code Online (Sandbox Code Playgroud)
这是一个复杂度为 O(log n) 而不是 O(n) 的版本(构建函数,而不是应用它):
composeN 0 f = id
composeN n f
| even n = g
| odd n = f . g
where g = g' . g'
g' = composeN (n `div` 2) f
Run Code Online (Sandbox Code Playgroud)