haskell - tipos - ¿Cómo llamar a la misma función ''n'' veces?
que numero anteponer para llamar a estados unidos (4)
Esta es una función que uso a menudo en el indicador ghci. Hay algunas formas de escribirlo, ninguna de las cuales me gustan especialmente, pero todas están razonablemente limpias:
fpow n f x = iterate f x !! n
fpow n f = foldr (.) id $ replicate n f
fpow n = foldr (.) id . replicate n -- just eta the above
fpow 0 f = id
fpow n f = f . fpow (n-1) f
Los dos del medio me atraen porque mi cerebro ha fragmentado foldr (.) id
para significar "componer una lista de funciones".
Solo me gustaría que estuviera en el preludio :-).
Posible duplicado:
Función de biblioteca para componer una función consigo misma n veces.
Necesito una función para llamar a otra función n veces.
por lo que se vería algo como esto fn = g (g (g (g (l))) donde n es igual al número de funciones g anidadas.
¿Cómo debo hacer esto? ¡Gracias!
Se puede hacer utilizando fold:
applyNTimes :: Int -> (a -> a) -> a -> a
applyNTimes n f val = foldl (/s e -> e s) val [f | x <- [1..n]]
iterate
es una solución común:
> :t iterate
iterate :: (a -> a) -> a -> [a]
Entonces, dada una función con un dominio igual a su rango, a -> a
, y una entrada inicial a
, produce una lista infinita de resultados en la forma:
iterate f a --> [a, f(a), f(f(a)), ...]
Y puedes acceder al elemento n de la lista usando !!
:
iterate f a !! n
NB iterate fa !! 0 == a
iterate fa !! 0 == a
.
f 0 = l
f n = g (f (n-1))
Pero más funcional sería:
f 0 l = l
f n l = g (f (n-1) l)
Esto también podría hacerse con pliegues o morfismos, pero esto es más fácil de entender.
Por ejemplo, aquí se usa un hilomorfismo, pero en realidad no lo hace más claro:
f g l = hylo l (.) (/n -> (g, n-1)) (==0)
Dice algo como componer (.) G (l) hasta que n == 0