2011-07-28 8 views
5

Tengo un gran archivo haskell que se compila y se ejecuta sin ningún problema. Quiero poner algunas funciones y escribir definiciones en un módulo separado en un archivo hs genérico y luego importarlo en mi módulo principal. Mientras el programa principal compila sin ningún error (también compila el módulo importado), obtengo un desbordamiento del espacio de la pila cuando intento ejecutarlo.Desbordamiento de espacio de pila al separar funciones en diferentes archivos hs

me trataron:

ghc --make -O2 Main.hs 
./Main -- stack space overflow 

también:

ghc --make -O2 Main.hs Other.hs -o RunMe 
./RunMe -- again, stack space overflow 

Es la manera correcta para compilar o me estoy perdiendo algo?

Respuesta

6

Lo está compilando correctamente. El problema debe estar en el código mismo. Dividirlo en diferentes módulos probablemente causó que GHC aplicara optimizaciones de manera diferente lo que causó la aparición de este problema.

Una razón probable es que GHC anteriormente pudo usar el análisis de rigurosidad para generar un programa que se ejecutaba en un espacio de pila constante. Dividir el módulo en dos y luego hacer que GHC ya no sea capaz de hacer las mismas suposiciones de rigor, por lo que no pudo garantizar que hacer la función estricta fuera seguro.

La solución probablemente será agregar sus propias anotaciones de rigor o utilizar una versión estricta de la función que esté causando esto.

+2

El uso gratuito de INLINE pragmas probablemente arreglaría esto también. –

+0

Agregar anotaciones de rigurosidad solucionó el problema. Esto no fue necesario en un solo módulo. – vis

5

Me imagino que GHC puede optimizar mejor la pila de funciones utilizada (haciendo strictness analysis) cuando las funciones son llamadas desde el mismo módulo en el que están definidas. Parece que tiene una fuga de espacio al menos una función tuya, y GHC no puede optimizarla cuando no sabe cómo se llama a la función.

Hay muchas explicaciones en la red para encontrar y solucionar desbordamientos de pila. Consulte, por ejemplo, Haskell Wiki y RWH.

+0

Consejos útiles. Gracias +1 – vis

Cuestiones relacionadas