en Haskell, si escriboAcumuladores en Haskell
fac n = facRec n 1
where facRec 0 acc = acc
facRec n acc = facRec (n-1) (acc*n)
y compilarlo con GHC, el resultado será diferente que si usara
fac 0 = 1
fac n = n * fac (n-1)
que fácilmente podría hacer fac n = product [1..n]
y evitar la Todo, pero estoy interesado en cómo funciona un intento de recursividad de cola en un lenguaje perezoso. Entiendo que todavía puedo tener un desbordamiento de la pila debido a que los thunk se están acumulando, pero ¿algo realmente sucede de manera diferente (en términos del programa compilado resultante) cuando uso un acumulador que cuando digo la recursividad ingenua? ¿Hay algún beneficio en dejar de lado la recursividad de la cola que no sea una legibilidad mejorada? ¿La respuesta cambia si uso runhaskell
para ejecutar el cálculo en lugar de compilarlo primero?
¿Cuál es su definición de "algo realmente sucede de manera diferente"? La respuesta trivial es "sí", porque "son diferentes", uno es recursivo de cola y el otro no. Pero no creo que sea eso lo que estás preguntando ... – lijie
¿no quieres decir facRec n acc = facRec (n-1) (acc * n) ???? –
@lijie - Principalmente estoy interesado en si GHC optimiza las llamadas finales (con o sin el acumulador), pero lo dejé en general porque honestamente no estoy seguro de cómo la recursividad de cola interactúa con los lenguajes perezosos, y puede hacer otras cosas diferentes cosas basadas en mi uso de una forma frente a otra. No sé cuáles son esas otras cosas. – Inaimathi