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