Library function to compose a function with itself n times

Viewed 15438

Is there a library function available in Haskell to compose a function with itself n times?

For example I have this function:

func :: a -> a

and I want to do this:

func . func . func . func . func . func , ... 

(up to n times, where n is only known at runtime).

Note that the iterate function would not be appropriate for what I am doing, since I do not care about any intermediate results.

10 Answers

Here's a version that has complexity O(log n) instead of O(n) (to build the function, not to apply it):

composeN 0 f = id
composeN n f
    | even n = g
    | odd  n = f . g
    where g = g' . g'
          g' = composeN (n `div` 2) f

Another solution using foldr:

\n -> flip (foldr ($)) . replicate n

Related