Pregunta

Estoy buscando un compilador de Haskell que utilice una evaluación estricta de forma predeterminada en lugar de una evaluación diferida.Solo usaría OCaml, pero la sintaxis de Haskell es mucho mejor que el de OCaml (y Haskell es puro y tiene características interesantes como clases de tipos).

Realmente preferiría no poner constantemente !arena $!Está en todo mi programa.Un compilador con un conmutador o un preprocesador para incluir anotaciones estrictas sería realmente bueno.También sería útil si hubiera una manera de utilizar la evaluación diferida en ciertos lugares, en caso de que quiera algo como una lista infinita (probablemente nunca lo haga).

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

¿Fue útil?

Solución

Si usted tiene un compilador de Haskell que utiliza la evaluación estricta, no se compilará Haskell. Pereza no rigurosidad es parte de la especificación Haskell!

Sin embargo, hay alternativas.

  • DDC es un intento de crear una variante explícitamente perezoso de Haskell que soporta cosas como la actualización destructiva, siempre manteniendo el resto de la bondad de Haskell. Pero hay un problema: el compilador es en la actualidad sólo en el α-etapa, aunque parece ser al menos utilizable

  • .
  • Crear una preprocesador, como han hecho otros.

  • Aprender a usar Haskell “de la manera correcta”. Si usted puede simplificar su caso de prueba a algo que es públicamente visualizables, puede publicar en la Haskell-Café lista de correo , donde las personas son muy útiles con este tipo de preguntas acerca de los efectos de la falta de rigor.

Otros consejos

  

Me gustaría mucho que no pongo constantemente! S y $! S todo sobre mi programa

Lo estás haciendo mal, si eso es lo que estás programación Haskell :) Simplemente no necesita hacer esto. Utilice GHC, utilizar O2, utilizar tipos de datos estrictos en su caso, utilizar los perezosos cuando sea apropiado. No asuma la pereza va a ser un problema. - se trata de una solución a muchos problemas

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

Pero ambos se centraron en pegarse a la semántica no estrictas de Haskell, pero sobre todo utilizando una estricta estrategia de evaluación, en lugar de realmente cambiar la semántica, y tampoco nunca realmente vio la luz del día.

Editar: sugerencia de estricta-plugin de Martijn parece ideal para sus propósitos, ya que en realidad hace lo que quiere y el autor todavía está activo en la comunidad Haskell, me había olvidado de ella

.

Ver también ghc-estricta-plugin , un ejemplo para marco Plugin de GHC, que se describe en el Mónada lector 12 .

Me siento su dolor. Mi mayor PITA en mi programación del día a día se ocupa de esos! @ # $% ^ & (Fugas de espacio.

Sin embargo, si ayuda, con el tiempo que se aprende (por las malas) sobre cómo hacer frente a esto, y se pone mejor. Pero todavía estoy esperando por Andy Gill para salir con su mágica perfilador de fugas espacio para solucionar todos mis problemas. (Estoy tomando su mano fuera de comentario a mí en el último ICFP que había ideado esta idea fresca como una promesa para implementarlo.)

No voy a tratar de convencerte de que la evaluación perezosa es la mejor cosa en el mundo, pero hay ciertas cosas buenas sobre él. Tengo algunos programas de tratamiento de flujo que scoot listas perezosos a través de cualquier variedad de combinadores que se ejecutan felizmente en gigabytes de datos durante el uso de sólo 3,5 MB o menos de memoria (de los cuales más de 2 MB es GHC tiempo de ejecución). Y alguien más inteligente que yo señalé a mí el año pasado que sería realmente muy sorprendido, como un típico programador Haskell, la cantidad que depende de la evaluación perezosa.

Pero lo que realmente necesitamos es un libro muy bueno sobre el tratamiento de la evaluación perezosa en el mundo real (que no es tan diferente del mundo académico, realmente, excepto que simplemente no consiguen un trabajo publicado, y tenemos clientes viene después de nosotros con cuchillos) que cubra adecuadamente la mayor parte de las cuestiones relacionadas con esto y, más importante aún, nos dan un sentido intuitivo de lo que va a explotar nuestro acervo y lo que no lo es.

No creo que esto es una cosa nueva; Estoy seguro que otros lenguajes y arquitecturas han pasado por esto también. ¿Cómo los primeros programadores para hacer frente a las pilas de hardware y todo lo que, después de todo? No tan bien, apuesto.

pH compilador de Jan-Willem Maessan es / era estricto. El siguiente más cercano es especulativa tenedor Evaluación de Robert Ennal para GHC 5. El tenedor spec_eval no es estricta, pero en su lugar se evalúa con optimismo. No sé si alguno de los que todavía están en curso / utilizable / etc.

El uso de nfdata y RNF todas partes no es una solución, ya que significa que atraviesan repetidamente grandes estructuras que ya han sido evaluados.

En el capítulo introductorio de la tesis doctoral de Ben Lippmeier (sobre DDC) se trata de la mejor crítica de Haskell que he visto - se discute asuntos de la pereza, la actualización destructiva, transformadores mónada, etc. DDC tiene la pereza, pero hay que solicitar explícitamente, y se considera un efecto, que es controlar y administrar el sistema de tipo y efecto de DDC.

Hace poco vi un poco de trabajo en esta área:

https://ghc.haskell.org/trac/ghc/wiki/StrictPragma

Se puede escuchar un poquito de ello en la actualización de estado de GHC SPJ aquí:

http://youtu.be/Ex79K4lvJno?t=9m33s (Enlace comienza en la pieza correspondiente a las 9:33)

Estoy buscando un compilador de Haskell que utilice una evaluación estricta de forma predeterminada en lugar de una evaluación diferida.

Un compilador así no sería un compilador Haskell.Si usted en realidad quieres, podrías considerar poner {-# LANGUAGE Strict #-} pragmas en sus archivos.Esto funcionará con GHC 8.0.2, 8.2.2 y 8.4.1, también conocidas como las tres últimas versiones del compilador.

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

No existe tal método.En su lugar, utilice GHC como estaba previsto: como un lenguaje vago.Aprender a pensar en su código, perfil y utilizar estructuras de datos funcionales correctamente será mucho más útil que aplicar pragmas estrictos sin pensar en todas partes.GHC ya dispone de un analizador de rigor.

(Probablemente nunca lo haré).

Eso es exactamente lo que los autores de llvm-hs pensamiento cuando eligieron utilizar una mónada estatal estricta en lugar de una perezosa.En cambio, causó un error inesperado en el futuro.La pereza y la recursividad van de la mano.

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

Dudo que esto sea realmente lo que desea cuando no aumenta de manera confiable el rendimiento del código Haskell y al mismo tiempo rompe el código existente y hace que los recursos existentes sean inútiles.Si así es como pretende escribir programas, utilice OCaml o Scala y deje en paz a la comunidad Haskell.

IIRC, Simon Peyton Jones incluso dijo que la evaluación perezosa no era realmente necesaria, estaba ahí principalmente para evitar que convirtieran el lenguaje en impuro.

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

Hay también seqaid , que apunta a la mitad del espectro lazy-estricta.

  

Seqaid es un plugin GHC proporcionar no invasiva auto-instrumentación de proyectos Haskell, por rigor dinámica (y paralelismo) control. Esto incluirá pronto optimización automatizada para el alivio de fugas espacio utilizando strictification mínima.

claramente ha tomado una decisión sobre el valor de la evaluación estricta, pero creo que se echa en falta el punto de utilizar Haskell. la evaluación perezosa de Haskell permite estrategias de optimización mucho más flexibles para ser empleados por el compilador / intérprete. Obligando a su propia rigidez anula el optimizador. Al final, el uso excesivo de evaluación estricta nunca será tan eficiente como la optimización automatizada. Prueba una suma plegado de una secuencia de números en GHCi, con y luego, sin evaluación perezosa. Se puede ver la diferencia con toda claridad -. En este caso la evaluación perezosa es siempre más rápido

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top