Como novato en Haskell, estoy intentando iterar una función (por ejemplo, el mapa logístico) una gran cantidad de veces. En un lenguaje imperativo, este sería un bucle simple, sin embargo, en Haskell termino con desbordamiento de pila. Tomemos por ejemplo el código:Haskell: repite una función una gran cantidad de veces sin stackoverflow
main = print $ iter 1000000
f x = 4.0*x*(1.0-x)
iter :: Int -> Double
iter 0 = 0.3
iter n = f $ iter (n-1)
Para un pequeño número de iteraciones funciona el código, pero por un millón de iteraciones consigo un desbordamiento de espacio de pila:
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
No puedo entender por qué sucede esto. La recursividad de la cola debería estar bien aquí. Tal vez el problema es la evaluación perezosa. Experimenté con varias formas de forzar una evaluación estricta, insertando $!
o seq
en varias posiciones, pero sin éxito.
¿Cuál sería la forma de Haskell de iterar una función una gran cantidad de veces?
He tratado sugerencias de los mensajes relacionados: here o here, pero siempre terminaba con stackoverflow para un gran número de iteraciones, por ejemplo, main = print $ iterate f 0.3 !! 1000000
.
el problema es que no tiene una repetición de cola ya que no regresa directamente 'iter (n-1)' – Simon
Es curioso que las personas simplemente no obtengan la repetición de cola. FYI, esta definición es incorrecta: "cuando el nombre de la función en la que estamos recién aparece aparece en la última línea de esa función". – Ingo