programacion - desactivar la evaluación perezosa en haskell
programacion funcional con haskell pdf (7)
Además de lo que Daniel Wagner enumeró, es posible que desee consultar una pregunta similar. ¿Existe un compilador o preprocesador de Haskell que utilice una evaluación estricta? .
- Las respuestas incluyen el compilador DDC que intenta crear una versión estricta de haskell y solo de forma perezosa explícitamente
- plugin ghc descrito en monad.reader 12
- "Usando nfdata y rnf en todas partes" - solrize
- y más
Sin embargo, la sugerencia predominante es usar herramientas de creación de perfiles y aprender a optimizar Haskell tal como está, ya que la mayoría lo consideraría un lenguaje diferente con la evaluación no estricta desactivada.
¿Es posible desactivar la evaluación perezosa en Haskell?
¿Hay una bandera de compilador específica de la biblioteca para facilitar esto?
Quería probar algo nuevo con un programa antiguo que había escrito hacía un tiempo, para ver si podía mejorar el rendimiento.
El paquete strict-identity
tiene una versión estricta de la mónada de Identity
.
Lo puedes encontrar aquí: https://hackage.haskell.org/package/strict-identity
El uso se vería algo así:
foo = runStrictIdentity $! do
x <- f a b
y <- g x y
return $! x + y
Cada vez que se utiliza return
o bind >>=
, las dos partes se evalúan utilizando seq
, lo que proporciona una garantía razonable de rigor siempre que su estructura de datos no sea demasiado profunda. Esto funciona, por ejemplo, números y estructuras básicas.
Hay una variante de Haskell llamada pH ( http://csg.csail.mit.edu/projects/languages/ph.shtml ) que utiliza una evaluación entusiasta y al mismo tiempo proporciona una semántica no estricta. El Informe Haskell es cuidadoso al decir que es un lenguaje no estricto. La pereza es la forma obvia de describir y, aparentemente, implementar el no rigor.
Por lo tanto, si su pregunta es "¿Podemos usar un sistema de evaluación diferente mientras mantenemos una semántica no estricta", podría ver el pH? Si su pregunta es "¿Existe una versión de Haskell que comparte la sintaxis de la superficie pero es estricta por defecto", creo que está cubierta por otras respuestas.
Hay varias maneras de hacer que una cosa perezosa sea estricta. Usted puede:
- Insertar explícitamente una coincidencia de patrón no esencial.
- Utilice
seq
o su pariente cercano($!)
. - Utilice
BangPatterns
. - Use anotaciones de rigor en sus tipos.
Más información here .
La respuesta simple es no. La respuesta más compleja es que el modelo computacional sobre el que Haskell construye y evalúa las funciones funciona de manera perezosa. Como leerá en otra respuesta, hay maneras de forzar la evaluación de algunas funciones antes de lo normal, y ocasionalmente es adventicio hacerlo. Pero hay una gran parte de Haskell válida que no tiene forma normal. Esto incluye las funciones IO y una gran cantidad del preludio estándar.
Conclusión: no hay más manera de desactivar la evaluación perezosa en Haskell, entonces hay una forma de desactivar la aritmética de punteros en C o desactivar OO en Ruby de Java. Sospecho que esto está mucho más lejos que tú, aunque esta pregunta te llevaría. (No hay modo de modo --strict
), pero si realmente desea ver qué tan profundo es el agujero Rabit, " Implementar lenguajes funcionales perezosos en el hardware de archivo: la máquina G sin etiquetas sin espinas " de Simon Peyton Jones es una aventura que vale la pena tener.
No puede apagar la pereza, porque el sistema de E / S de Haskell depende de ello. Sin una evaluación perezosa, este programa se ejecutaría en un bucle ocupado sin emitir nada:
main = forever (putStrLn "Hello!")
Esto es porque forever c
es un programa infinito. Con la evaluación perezosa, el programa se calcula solo en la medida necesaria para ejecutar la siguiente instrucción. Si desactivas la pereza, todas las funciones se vuelven estrictas, incluido (>>)
, lo que básicamente hace que la función forever
diverja:
forever c = let cs = c >> cs in cs
Sin embargo, puede agregar anotaciones de rigor a los constructores y patrones. Cuando una función es estricta, su argumento se fuerza como parte de la evaluación del resultado independientemente de si el argumento es necesario o no. Esto se parece a una evaluación entusiasta.
Puede habilitar el pragma Strict
en un módulo, lo que hará que todo sea estricto de forma predeterminada.