Repeated function application

Hello I was surprised to be unable to find anything like this in the standard libraries: times :: (a -> a) -> Int -> (a -> a) times f 0 = id times f n = f . (times f (n-1)) Am I missing something more general which would allow me to repeatedly apply a function to an input? Or is this not useful? I thought this looked a bit like a fold, so I tried expressing it like this: times f n x = foldl (flip ($)) x (replicate n f) ... which horrifies me, but I can't help feeling that there must be a way to get rid of the explicit recursion. How would you implement times? Ben

Ben Butler-Cole writes:
times :: (a -> a) -> Int -> (a -> a) times f 0 = id times f n = f . (times f (n-1))
Am I missing something more general ...I can't help feeling that there must be a way to get rid of the explicit recursion.
How would you implement times?
Anything against (apart an auxiliary list, and "x" not curried away) times n f x = (iterate f x)!!n Jerzy Karczmarczuk

Am Donnerstag, 21. Februar 2008 16:58 schrieb Ben Butler-Cole:
Hello
I was surprised to be unable to find anything like this in the standard libraries:
times :: (a -> a) -> Int -> (a -> a) times f 0 = id times f n = f . (times f (n-1))
times f n = (!! n) . iterate f
[…]
Best wishes, Wolfgang

Ben Butler-Cole wrote:
Hello
I was surprised to be unable to find anything like this in the standard libraries:
times :: (a -> a) -> Int -> (a -> a) times f 0 = id times f n = f . (times f (n-1))
Am I missing something more general which would allow me to repeatedly apply a function to an input? Or is this not useful?
Invariably, this seems to invite a stack overflow when I try this (and is usually much slower anyway). Unless f is conditionally lazy, f^n and f will have the same strictness, so there is no point in keeping nested thunks. If you apply f immediately to x, there is no stack explosion and faster runtime: times :: (a -> a) -> Int -> (a -> a) times f !n !x | n > 0 = times f (n-1) (f x) | otherwise = x Dan
participants (4)
-
Ben Butler-Cole
-
Dan Weston
-
jerzy.karczmarczuk@info.unicaen.fr
-
Wolfgang Jeltsch