haskell - trabajan - para que sirve una biblioteca
Función de biblioteca para componer una función consigo misma n veces (8)
La solución iterate
está bien, o puede que le guste esta: la composición de n
copias de f
es foldr (.) id (replicate nf)
.
¿Hay una función de biblioteca disponible en Haskell para componer una función consigo misma n veces?
Por ejemplo, tengo esta función:
func :: a -> a
y quiero hacer esto:
func . func . func . func . func . func , ...
(hasta n veces, donde n solo se conoce en tiempo de ejecución).
Tenga en cuenta que la función iterar no sería apropiada para lo que estoy haciendo, ya que no me importan los resultados intermedios.
No sé por qué dices que iterate
no es apropiado. Es perfectamente adecuado para este propósito. (!! n) . iterate func
(!! n) . iterate func
es la composición de n
copias de func
.
(Alguien había publicado una respuesta similar al código anterior, pero parece haberlo borrado).
Soy un principiante en Haskell, actualmente en el capítulo 5 ("Funciones de orden superior") de ¡ Aprende Haskell para obtener un gran bien! así que todavía no estoy familiarizado con las funciones que se muestran en las respuestas anteriores. Dado lo que entiendo hasta ahora, lo haría así:
applyNTimes :: Int -> (a -> a) -> a -> a
applyNTimes n f x
| n == 0 = x
| otherwise = f (applyNTimes (n-1) f x)
Una variación de la respuesta de Trinithis usando el paquete newtype , solo por diversión:
(/n f -> under Endo (mconcat . replicate n) f)
O sin puntos:
under Endo . (mconcat .) . replicate
(/n -> appEndo . mconcat . replicate n . Endo) nfx
/n -> appEndo . foldMap Endo . replicate n
/xs n -> iterate func xs !! n
No sé por qué, pero siento que iterate
es algo a lo que la gente no está constantemente expuesta cuando aprende Haskell.
¡Si no te gusta !!
entonces podrías usar zip
y lookup
como una alternativa. (a algunas personas / grupos / herramientas no les gustan las funciones que llaman "error" en ciertos casos, no estoy diciendo que la búsqueda sea mejor en estos casos)
lookup n . zip [0..] . iterate func
EDITAR: Ok, entonces borré y luego lo borré porque estoy de acuerdo con el otro que responde: no debes descontar el uso de iterar solo porque te da más de lo que necesitas.
iterate (f .) id !! n
o
iterate (f .) f !! (n-1)
dependiendo de si n == 0
está permitido.