Tengo algo de experiencia escribiendo herramientas pequeñas en Haskell y me parece muy intuitivo de usar, especialmente para escribir filtros (que usan interact
) que procesan su entrada estándar y la canalizan a la salida estándar.
Recientemente intenté usar uno de esos filtros en un archivo que era aproximadamente 10 veces más grande de lo habitual y recibí un Stack space overflow
error.
Después de leer un poco (por ejemplo, aquí y aquí ) he identificado dos pautas para ahorrar espacio en la pila (Haskellers experimentados, corríjanme si escribo algo que no es correcto):
- Evite las llamadas de función recursivas que no son recursivas de cola (esto es válido para todos los lenguajes funcionales que admiten la optimización de llamada de cola).
- Presente
seq
para forzar la evaluación temprana de las subexpresiones para que las expresiones no crezcan demasiado antes de que se reduzcan (esto es específico para Haskell, o al menos para los idiomas que usan una evaluación diferida).
Después de introducir cinco o seis seq
llamadas en mi código, mi herramienta vuelve a funcionar sin problemas (también en los datos más grandes). Sin embargo, creo que el código original era un poco más legible.
Como no soy un programador experimentado de Haskell, quería preguntar si presentarlo seq
de esta manera es una práctica común y con qué frecuencia se verá normalmente seq
en el código de producción de Haskell. ¿O hay alguna técnica que permita evitar usarlo con seq
demasiada frecuencia y aún así usar poco espacio en la pila?