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

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to