usar instalar como compiler-construction haskell lazy-evaluation

compiler-construction - instalar - como usar haskell



¿Hay un compilador o preprocesador de Haskell que utilice una evaluación estricta? (11)

Estoy buscando un compilador de Haskell que use una evaluación estricta por defecto en lugar de una evaluación perezosa.

Tal compilador no sería un compilador de Haskell. Si realmente desea, puede considerar poner {-# LANGUAGE Strict #-} pragmas en sus archivos. Esto funcionará con GHC 8.0.2, 8.2.2 y 8.4.1, también conocido como los tres últimos lanzamientos del compilador.

También sería útil si hubiera una manera de utilizar la evaluación perezosa en ciertos lugares, en caso de que quisiera algo como una lista infinita.

No hay tal método. En su lugar, use GHC como fue pensado, como un lenguaje perezoso. Aprender a pensar acerca de su código, perfil y utilizar las estructuras de datos funcionales correctamente será mucho más útil que la aplicación sin sentido de los pragmas de rigor en todas partes. GHC ya tiene un analizador de rigor.

(Probablemente nunca lo haré).

Eso es exactamente lo que pensaron los autores de llvm-hs cuando eligieron usar una mónada estatal estricta en lugar de una perezosa. En su lugar, causó un error inesperado en el camino. La pereza y la recursión van de la mano.

Por favor, no intente convencerme de que la evaluación perezosa es mejor, realmente necesito el rendimiento.

Tengo dudas de que esto es lo que realmente quieres cuando no aumenta de manera confiable el rendimiento del código Haskell mientras que al mismo tiempo rompe el código existente y hace que los recursos existentes sean inútiles. Si así es como piensa escribir programas, solo use OCaml o Scala y deje la comunidad de Haskell en paz.

En IIRC, Simon Peyton Jones incluso dijo que la evaluación perezosa no era realmente necesaria, que estaba allí principalmente para evitar que impusieran el lenguaje.

Eso no es verdad. Puedes leer más sobre la historia real de Haskell here

Estoy buscando un compilador de Haskell que use una evaluación estricta por defecto en lugar de una evaluación perezosa. Solo usaría OCaml, pero la sintaxis de Haskell es mucho mejor que la de OCaml (y Haskell es puro, y tiene características geniales como clases de tipo).

Realmente prefiero no poner constantemente ! s y $! s en todo mi programa. Un compilador con un interruptor o un preprocesador para poner en las anotaciones de rigor sería realmente agradable. También sería útil si hubiera una manera de utilizar la evaluación perezosa en ciertos lugares, en caso de que quisiera algo como una lista infinita (probablemente nunca lo haré).

Por favor, no intente convencerme de que la evaluación perezosa es mejor, realmente necesito el rendimiento. En IIRC, Simon Peyton Jones incluso dijo que la evaluación perezosa no era realmente necesaria, que estaba allí principalmente para evitar que impusieran el lenguaje.


Realmente preferiría no poner constantemente! Sy $! S en todo mi programa

Lo estás haciendo mal, si así es como estás programando Haskell :) Simplemente no necesitarás hacer esto. Use GHC, use -O2, use tipos de datos estrictos cuando sea apropiado, use perezosos cuando sea apropiado. No asuma que la pereza va a ser un problema, es una solución a muchos problemas.


Claramente, has tomado una decisión sobre el valor de la evaluación estricta, pero creo que te estás perdiendo el punto de usar Haskell. La perezosa evaluación de Haskell permite que el compilador / intérprete emplee estrategias de optimización mucho más flexibles. Forzar tu propia rigurosidad anula el optimizador. Al final, el uso de una evaluación excesivamente estricta nunca será tan eficiente como la optimización automatizada. Pruebe una suma plegable sobre una secuencia de números en GHCI, con y luego sin una evaluación perezosa. Puede ver la diferencia claramente: en este caso, la evaluación perezosa siempre es más rápida.


Creo que el compilador de pH de Jan-Willem Maessan es / fue estricto. La siguiente más cercana es la bifurcación de evaluación especulativa de Robert Ennal para ghc 5. La bifurcación spec_eval no es estricta, sino que evalúa de manera optimista. No sé si alguno de estos sigue siendo actual / usable / etc.


Ha habido dos intentos de evaluar estrictamente Haskell en el pasado:

Pero ambos se centraron en seguir la semántica no estricta de Haskell, pero utilizaron una estrategia de evaluación mayoritariamente estricta, en lugar de cambiar la semántica, y ninguno de los dos vio realmente la luz del día.

Edición: la sugerencia de Martijn de un complemento estricto parece ideal para sus propósitos, ya que en realidad hace lo que quiere y el autor todavía está activo en la comunidad de Haskell, lo había olvidado.



Si tienes un compilador de Haskell que usa una evaluación estricta, no compila Haskell. pereza ¡El no-rigor es parte de la especificación de Haskell!

Sin embargo, hay alternativas.

  • DDC es un intento de crear una variante explícitamente perezosa de Haskell que admite cosas como la actualización destructiva, al tiempo que conserva todo el resto de la bondad de Haskell. Hay un problema: el compilador está actualmente solo en la etapa α, aunque parece ser al menos utilizable.

  • Crea un preprocesador, como han hecho otros.

  • Aprende a usar Haskell "de la manera correcta". Si puede simplificar su caso de prueba a algo que se pueda mostrar públicamente, puede publicarlo en la lista de correo de Haskell-Café , donde las personas son muy útiles con este tipo de preguntas relacionadas con los efectos de la falta de rigidez.


Siento tu dolor. Mi PITA más grande en mi programación del día a día es tratar con esos! @ # $% ^ & (Pérdidas de espacio).

Sin embargo, si ayuda, con el tiempo sí aprende (de la manera difícil) cómo lidiar con esto, y mejorará. Pero todavía estoy esperando a que Andy Gill salga con su perfilador de fugas de espacio mágico para solucionar todos mis problemas. (Me llevo su comentario directo a la última ICFP de que había ideado esta idea genial como una promesa para implementarla).

No intentaré convencerte de que la evaluación perezosa es lo mejor del mundo, pero hay algunos puntos positivos al respecto. Tengo algunos programas de procesamiento de flujo que recorren listas perezosas a través de cualquier variedad de combinadores que se ejecutan felizmente en gigabytes de datos, mientras que usan solo 3.5 MB de memoria (de los cuales más de 2MB es tiempo de ejecución de GHC). Y alguien más inteligente de lo que me comentaron el año pasado es que, como típico programador de Haskell, realmente se sorprendería de lo mucho que depende de la evaluación perezosa.

Pero lo que realmente necesitamos es un libro realmente bueno sobre cómo lidiar con la evaluación perezosa en el mundo real (que no es muy diferente del mundo académico, en realidad, excepto que simplemente no publican un artículo, y los clientes nos persiguen) con cuchillos) que cubrirá adecuadamente la mayoría de los problemas relacionados con esto y, lo que es más importante, nos da una idea intuitiva de lo que va a explotar nuestro montón y lo que no.

No creo que esto sea algo nuevo; Estoy seguro de que otros idiomas y arquitecturas han pasado por esto también. ¿Cómo hicieron los primeros programadores para lidiar con las pilas de hardware y todo eso, después de todo? No tan bien, apuesto.


También hay seqaid , que apuntan a la mitad del espectro perezoso-estricto.

Seqaid es un complemento de GHC que proporciona autoinstrucción no invasiva de proyectos Haskell, para el control dinámico de la rigurosidad (y el paralelismo). Esto pronto incluirá la optimización para el alivio de fugas de espacio automatizado utilizando una estricta restricción mínima.


Usar nfdata y rnf en todas partes no es una solución, ya que significa atravesar repetidamente grandes estructuras que ya han sido evaluadas.

El capítulo introductorio de la tesis doctoral de Ben Lippmeier (sobre DDC) trata sobre la mejor crítica de Haskell que he visto: analiza problemas de pereza, actualización destructiva, transformadores de mónada, etc. DDC tiene pereza pero debe solicitarla explícitamente. , y se considera un efecto, que se rastrea y administra mediante el sistema de tipo y efecto de DDC.