universitario una trabajan son sirve servicios que publica personas para funciones funciona cuantas cuales como bibliotecas bibliotecario biblioteca actualidad haskell

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.