合成函数n次Haskell

composition function n times Haskell

有谁知道如何创建一个函数 (addOne''),它对给定函数 (addOne') 执行 n 次自身 (addOne')?基本上是 f(f(x)) n 次

addOne :: Int -> Int
addOne x = x*2

addOne' :: [Int] -> [Int]
addOne' [] = []
addOne' (x:xs) = addOne x : addOne' xs

addOne'' :: Int -> [Int] -> [Int]
addOne'' ????

所以我想对自身执行函数 addOne' n 次。谢谢!

根据下面 OP 的评论,OP 可能对 iterate 函数感兴趣,该函数将参数重复应用于初始值以创建一个列表,其中每个元素记录特定步骤的结果。

iterate :: (a -> a) -> a -> [a]
iterate f x =  x : iterate f (f x)

如果你取结果列表的第 n 个元素,那将是函数应用 n 次后的结果。

iterate f x !! n == f . f .... f . f $ x
--                  '-- n times ---'

如果我没理解错的话,你只需要简单的递归。如果你想自己制作这个功能,这里有一个可能的实现:

recN :: (a -> a) -> Int -> (a -> a)
recN f n = recN_ f n
  where recN_ acc 1 = acc
        recN_ acc n_ = recN_ (f . acc) (n_ - 1)


-- usage : x4 is a function the multiply by 4, defined as (*2).(*2)
-- let x4 = recN (*2) 2 in x4 2
-- => 8

请注意,此解决方案使用带累加器的递归子函数。这是函数式编程中的常见模式。此外,如果使用负数或 null 'n' 调用此函数,它将永远(或几乎)运行。您可以使用例如模式守卫而不是模式匹配来解决递归边缘条件的问题。

很短 (n > 0)

reapply :: Int -> (a -> a) -> a -> a
reapply n f = foldr1 (.) $ replicate n f

备选 (n >= 0)

reapply' :: Int -> (a -> a) -> a -> a
reapply' n f x = (iterate f x) !! n 

无积分(n >= 0

reapply'' :: Int -> (a -> a) -> a -> a
reapply'' n f = flip (!!) n . iterate f  

如果有人正在寻找一种简洁的方式来编写 f ^ n,一个应用 f n 次的函数,这里有一个:

foldr (.) id (replicate n f)

例如,(+1) ^ n = (+n)是:

foldr (.) id (replicate n (+1))