Estoy aprendiendo Haskell, lo siento si mi pregunta es estúpida. Estoy leyendo learnyouahaskell.com y ahora estoy en el capítulo 5 "Recursión". Hay un ejemplo de aplicación de la función estándar 'inversa':Implementar marcha atrás en Haskell que se ejecuta en tiempo lineal
reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]
pero parece que se ejecuta en O (n^2), mientras que el revés norma se ejecuta en O (N) (eso espero). El siguiente código ilustra esto:
sum (reverse [1,2..1000000]) -- runs pretty fast
sum (reverse' [1,2..1000000]) -- never finishes
Entonces, comencé a pensar cómo implementar mi propio reverso más rápido. Es bastante fácil de hacer en idiomas imperativos. Tal vez necesito algún material más avanzado de capítulos posteriores para hacer esto? Cualquier sugerencia es bienvenida.
¿Esto no tiene los problemas clásicos de la pila de 'foldl'? –
La versión suministrada por Kru proviene directamente de la fuente. Tenga en cuenta que los contenidos de la lista no se evalúan solo su posición es. Además, si no usa toda la lista invertida, la lista nunca se creará. –
@ 3noch, creo que ese es el caso con 'foldr' pero no con' foldl' – symbiont