unidos tipos son que pattern para números numero los llamar lada imprimir hablar funciones estados ejemplos desde datos cómo cuál como codigos codigo clave ciclos celular california cadenas argentina anteponer haskell

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