La semántica de Haskell se basa históricamente en la del lenguaje de programación Miranda , que sirvió para centrar los esfuerzos del grupo de trabajo inicial de Haskell. [28] La última especificación formal del lenguaje se realizó en julio de 2010, mientras que el desarrollo de GHC continúa expandiendo Haskell a través de extensiones del lenguaje.
Haskell se utiliza en el ámbito académico y en la industria. [29] [30] [31] En mayo de 2021 [actualizar], Haskell era el 28.º lenguaje de programación más popular en las búsquedas de tutoriales de Google , [32] y representaba menos del 1 % de los usuarios activos en el repositorio de código fuente de GitHub . [33]
Historia
Después del lanzamiento de Miranda por Research Software Ltd. en 1985, el interés en los lenguajes funcionales perezosos creció. Para 1987, existían más de una docena de lenguajes de programación no estrictos , puramente funcionales. Miranda era el más utilizado, pero era software propietario . En la conferencia sobre lenguajes de programación funcional y arquitectura informática (FPCA '87) en Portland, Oregón , hubo un fuerte consenso para que se formara un comité para definir un estándar abierto para dichos lenguajes. El propósito del comité era consolidar los lenguajes funcionales existentes en uno común que sirviera como base para futuras investigaciones en el diseño de lenguajes funcionales. [34]
Haskell 1.0 a 1.4
Haskell fue desarrollado por un comité que intentó reunir soluciones ya existentes siempre que fuera posible.
En las primeras versiones de Haskell, hasta la versión 1.2 inclusive, la interacción del usuario y la entrada/salida (IO) se manejaban mediante mecanismos basados en flujos y en continuidad, que se consideraban ampliamente insatisfactorios. [36] En la versión 1.3, se introdujo la IO monádica , junto con la generalización de las clases de tipos a clases superiores (constructores de tipos). Junto con la "notación do", que proporciona azúcar sintáctica para la clase de tipos Monad, esto le dio a Haskell un sistema de efectos que mantenía la transparencia referencial y era conveniente.
Otros cambios notables en las primeras versiones fueron el enfoque de la función 'seq', que crea una dependencia de datos entre valores y se utiliza en lenguajes perezosos para evitar el consumo excesivo de memoria; pasando de una clase de tipo a una función estándar para hacer que la refactorización sea más práctica.
La primera versión de Haskell ("Haskell 1.0") se definió en 1990. [1] Los esfuerzos del comité dieron como resultado una serie de definiciones del lenguaje (1.0, 1.1, 1.2, 1.3, 1.4).
Haskell 98
A finales de 1997, la serie culminó en Haskell 98 , destinada a especificar una versión estable, mínima y portátil del lenguaje y una biblioteca estándar complementaria para la enseñanza, y como base para futuras extensiones. El comité dio la bienvenida expresamente a la creación de extensiones y variantes de Haskell 98 mediante la adición e incorporación de características experimentales. [34]
En febrero de 1999, el estándar del lenguaje Haskell 98 se publicó originalmente como The Haskell 98 Report . [34] En enero de 2003, se publicó una versión revisada como Haskell 98 Language and Libraries: The Revised Report . [27] El lenguaje continúa evolucionando rápidamente, y la implementación del Glasgow Haskell Compiler (GHC) representa el estándar de facto actual . [37]
Haskell 2010
A principios de 2006, comenzó el proceso de definición de un sucesor del estándar Haskell 98, llamado informalmente Haskell Prime . [38] Se pretendía que fuera un proceso progresivo y continuo para revisar la definición del lenguaje, produciendo una nueva revisión hasta una vez al año. La primera revisión, llamada Haskell 2010 , se anunció en noviembre de 2009 [2] y se publicó en julio de 2010.
Haskell 2010 es una actualización incremental del lenguaje, que incorpora principalmente varias características muy utilizadas y no controvertidas que anteriormente estaban habilitadas mediante indicadores específicos del compilador.
Nombres de módulos jerárquicos. Se permite que los nombres de módulos consten de secuencias de identificadores en mayúsculas separados por puntos, en lugar de un solo identificador. Esto permite que los módulos se denominen de manera jerárquica (por ejemplo, Data.Listen lugar de List), aunque técnicamente los módulos siguen estando en un único espacio de nombres monolítico. Esta extensión se especificó en un anexo a Haskell 98 y, en la práctica, se utilizó de forma universal.
La interfaz de función externa (FFI) permite enlaces a otros lenguajes de programación. En el Informe solo se especifican enlaces a C , pero el diseño permite enlaces a otros lenguajes. Para respaldar esto, se permitió que las declaraciones de tipos de datos no contuvieran constructores, lo que habilita tipos nonce robustos para datos externos que no se podían construir en Haskell. Esta extensión también se especificó previamente en un Anexo al Informe de Haskell 98 y se usa ampliamente.
Los llamados patrones n + k (definiciones de la forma fact (n+1) = (n+1) * fact n) ya no estaban permitidos. Este azúcar sintáctico tenía una semántica engañosa, en la que el código parecía utilizar el (+)operador, pero en realidad se desazucaraba y se convertía en código que utilizaba (-)y (>=).
Las reglas de inferencia de tipos se relajaron para permitir que más programas pudieran verificar los tipos.
Se especificó el LANGUAGEpragma . En 2010, se utilizaban ampliamente docenas de extensiones del lenguaje y GHC (entre otros compiladores) proporcionó el LANGUAGEpragma para especificar extensiones individuales con una lista de identificadores. Los compiladores de Haskell 2010 deben admitir la Haskell2010extensión y se recomienda que admitan otras extensiones, que corresponden a extensiones agregadas en Haskell 2010.
Estándares futuros
La próxima especificación formal se había planeado para 2020. [3] El 29 de octubre de 2021, con la versión 9.2.1 de GHC, se lanzó la extensión GHC2021. Si bien no se trata de una especificación de lenguaje formal, combina varias extensiones GHC estables y ampliamente utilizadas para Haskell 2010. [39] [40]
Haskell tiene un sistema de tipos estático y sólido basado en la inferencia de tipos Hindley-Milner . Su principal innovación en esta área son las clases de tipos, concebidas originalmente como una forma de añadir sobrecarga al lenguaje, [41] pero que desde entonces han encontrado muchos más usos. [42]
Existe una comunidad activa y en crecimiento en torno al lenguaje, y más de 5400 bibliotecas y herramientas de código abierto de terceros están disponibles en el repositorio de paquetes en línea Hackage . [44]
módulo Main ( principal ) donde -- no es necesario en el intérprete, es el valor predeterminado en un archivo de módulomain :: IO () – el compilador puede inferir esta definición de tipo main = putStrLn "¡Hola, mundo!"
La función factorial en Haskell, definida de diferentes maneras (la primera línea es la anotación de tipo , que es opcional y es la misma para cada implementación):
factorial : :( Integral a ) => a -> a-- Usando recursión (con la expresión "ifthenelse") factorial n = if n < 2 then 1 else n * factorial ( n - 1 )-- Usando recursión (con coincidencia de patrones) factorial 0 = 1 factorial n = n * factorial ( n - 1 )-- Usando recursión (con guardas) factorial n | n < 2 = 1 | de lo contrario = n * factorial ( n - 1 )-- Usando una lista y la función "producto" factorial n = producto [ 1 .. n ]-- Usando fold (implementa "producto") factorial n = foldl ( * ) 1 [ 1 .. n ]-- Factorial de estilo sin puntos = foldr ( * ) 1 . enumFromTo 1
importar Data.Function ( corrección )factorial = fix fac donde fac f x | x < 2 = 1 | de lo contrario = x * f ( x - 1 )
Como el tipo Integer tiene precisión arbitraria , este código calculará valores como factorial 100000(un número de 456.574 dígitos), sin pérdida de precisión.
Una implementación de un algoritmo similar al ordenamiento rápido sobre listas, donde el primer elemento se toma como pivote:
-- Anotación de tipo (opcional, igual para cada implementación) quickSort :: Ord a => [ a ] -> [ a ]-- Uso de listas por comprensión quickSort [] = [] -- La lista vacía ya está ordenada quickSort ( x : xs ) = quickSort [ a | a <- xs , a < x ] -- Ordena la parte izquierda de la lista ++ [ x ] ++ -- Inserta pivote entre dos partes ordenadas quickSort [ a | a <- xs , a >= x ] -- Ordena la parte derecha de la lista-- Usando el filtro quickSort [] = [] quickSort ( x : xs ) = quickSort ( filter ( < x ) xs ) ++ [ x ] ++ quickSort ( filter ( >= x ) xs )
Las implementaciones que cumplen total o casi totalmente con el estándar Haskell 98 incluyen:
El compilador Glasgow Haskell (GHC) compila a código nativo en muchas arquitecturas de procesador diferentes y a ANSI C , a través de uno de dos lenguajes intermedios : C-- o, en versiones más recientes, bitcode LLVM (anteriormente Low Level Virtual Machine). [46] [47] GHC se ha convertido en el dialecto Haskell estándar de facto . [48] Hay bibliotecas (por ejemplo, enlaces a OpenGL ) que funcionan solo con GHC. GHC también se distribuyó con la plataforma Haskell .
Jhc, un compilador de Haskell escrito por John Meacham, enfatiza la velocidad y la eficiencia de los programas generados y explora nuevas transformaciones de programas.
Ajhc es una bifurcación de Jhc.
El compilador Utrecht Haskell (UHC) es una implementación de Haskell de la Universidad de Utrecht . [49] Admite casi todas las características de Haskell 98 más muchas extensiones experimentales. Se implementa utilizando gramáticas de atributos y se utiliza principalmente para la investigación sobre sistemas de tipos generados y extensiones de lenguaje.
Las implementaciones que ya no se mantienen activamente incluyen:
El sistema Gofer del usuario de Haskell ( Hugs ) es un intérprete de bytecode . En su momento fue una de las implementaciones más utilizadas, junto con el compilador GHC, [50] pero ahora ha sido reemplazado en su mayor parte por GHCi. También viene con una biblioteca de gráficos.
nhc98 es un compilador de código de bytes que se centra en minimizar el uso de memoria.
El compilador York Haskell ( Yhc ) fue una bifurcación de nhc98, con el objetivo de ser más simple, más portable y eficiente, e integrar soporte para Hat, el trazador de Haskell. También tenía un backend de JavaScript , lo que permitía a los usuarios ejecutar programas Haskell en navegadores web .
Las implementaciones que no son totalmente compatibles con Haskell 98 y que utilizan una variante del lenguaje Haskell incluyen:
Gofer es un dialecto educativo de Haskell, con una característica llamada clases constructoras , desarrollado por Mark Jones. Lo sustituyó Haskell User's Gofer System (Hugs).
Helium, un dialecto más nuevo de Haskell. El objetivo es facilitar el aprendizaje mediante mensajes de error más claros al deshabilitar las clases de tipos de forma predeterminada.
Aplicaciones notables
Agda es un asistente de pruebas escrito en Haskell. [51]
Cabal es una herramienta para crear y empaquetar bibliotecas y programas Haskell. [52]
Darcs es un sistema de control de revisiones escrito en Haskell, con varias características innovadoras, como un control más preciso de los parches a aplicar.
El compilador Glasgow Haskell (GHC) también suele ser un banco de pruebas para funciones de programación funcional avanzadas y optimizaciones en otros lenguajes de programación.
Git-annex es una herramienta para gestionar archivos de datos (grandes) bajo el control de versiones de Git . También proporciona un sistema de sincronización de archivos distribuido (asistente de git-annex).
Linspire Linux eligió Haskell para el desarrollo de herramientas del sistema. [53]
Pandoc es una herramienta para convertir un formato de marcado en otro.
GarganText [56] es una herramienta colaborativa para mapear mediante análisis semántico textos en cualquier navegador web , escrita íntegramente en Haskell y PureScript , que se utiliza por ejemplo en la comunidad de investigación para elaborar informes y hojas de ruta de última generación. [57]
Cryptol , un lenguaje y cadena de herramientas para desarrollar y verificar algoritmos de criptografía , está implementado en Haskell.
Facebook implementa sus programas antispam [58] en Haskell, manteniendo la biblioteca de acceso a datos subyacente como software de código abierto . [59]
GitHub implementó Semantic, una biblioteca de código abierto para el análisis, comparación e interpretación de código fuente no confiable, en Haskell. [61]
seL4 , el primer microkernel verificado formalmente , [63] utilizó Haskell como lenguaje de creación de prototipos para el desarrollador del sistema operativo. [63] : p.2 Al mismo tiempo, el código Haskell definió una especificación ejecutable con la que razonar, para la traducción automática por la herramienta de demostración de teoremas. [63] : p.3 El código Haskell sirvió así como un prototipo intermedio antes del refinamiento final de C. [63] : p.3
Jan-Willem Maessen, en 2002, y Simon Peyton Jones , en 2003, analizaron los problemas asociados con la evaluación perezosa y al mismo tiempo reconocieron los motivos teóricos para ello. [68] [69] Además de consideraciones puramente prácticas como un mejor rendimiento, [70] señalan que la evaluación perezosa hace que sea más difícil para los programadores razonar sobre el rendimiento de su código (en particular su uso del espacio).
Bastiaan Heeren, Daan Leijen y Arjan van IJzendoorn también observaron en 2003 algunos obstáculos para los estudiantes de Haskell: "La sintaxis sutil y el sofisticado sistema de tipos de Haskell son un arma de doble filo, muy apreciada por los programadores experimentados, pero también una fuente de frustración entre los principiantes, ya que la generalidad de Haskell a menudo conduce a mensajes de error crípticos". [71] Para abordar los mensajes de error, los investigadores de la Universidad de Utrecht desarrollaron un intérprete avanzado llamado Helium, que mejoró la facilidad de uso de los mensajes de error al limitar la generalidad de algunas características de Haskell. En particular, deshabilita las clases de tipos de forma predeterminada. [72]
Ben Lippmeier diseñó Disciple [73] como un dialecto estricto por defecto (perezoso por anotación explícita) de Haskell con un sistema de tipo y efecto, para abordar las dificultades de Haskell en el razonamiento sobre la evaluación perezosa y en el uso de estructuras de datos tradicionales como matrices mutables. [74] Él sostiene (p. 20) que "la actualización destructiva proporciona al programador dos herramientas importantes y poderosas... un conjunto de estructuras de datos eficientes similares a matrices para gestionar colecciones de objetos, y... la capacidad de transmitir un nuevo valor a todas las partes de un programa con una carga mínima para el programador".
Robert Harper , uno de los autores de Standard ML, ha dado sus razones para no utilizar Haskell para enseñar programación introductoria. Entre ellas se encuentran la dificultad de razonar sobre el uso de recursos con una evaluación no estricta, que la evaluación perezosa complica la definición de tipos de datos y el razonamiento inductivo, [75] y la "inferioridad" del (antiguo) sistema de clases de Haskell en comparación con el sistema de módulos de ML. [76]
La herramienta de compilación de Haskell, Cabal , ha sido criticada históricamente por manejar de manera deficiente múltiples versiones de la misma biblioteca, un problema conocido como "el infierno de Cabal". El servidor Stackage y la herramienta de compilación Stack se crearon en respuesta a estas críticas. [77] Cabal en sí mismo ahora tiene un sistema de compilación mucho más sofisticado, fuertemente inspirado en Nix , [78] que se convirtió en el predeterminado con la versión 3.0.
Idiomas relacionados
Clean es un pariente cercano y ligeramente más antiguo de Haskell. Su mayor desviación de Haskell está en el uso de tipos únicos en lugar de mónadas para entrada/salida (E/S) y efectos secundarios.
Se han desarrollado una serie de lenguajes inspirados en Haskell, pero con diferentes sistemas de tipos, entre los que se incluyen:
Hume , un lenguaje funcional estricto para sistemas embebidos basado en procesos como autómatas sin estado sobre una especie de tuplas de canales de buzón de un elemento donde el estado se mantiene mediante retroalimentación a los buzones, y una descripción de mapeo de salidas a canales como cableado de cajas, con un lenguaje de expresión y sintaxis similar a Haskell.
Conferencias y talleres
La comunidad Haskell se reúne periódicamente para realizar actividades de investigación y desarrollo. Los eventos principales son:
ZuriHac, [79] especie de Hackathon que se celebra cada año en Zúrich
A partir de 2006, se han llevado a cabo una serie de hackatones organizados , la serie Hac, cuyo objetivo era mejorar las herramientas y bibliotecas del lenguaje de programación. [80]
Referencias
^ abc Hudak y otros 2007.
^ ab Marlow, Simon (24 de noviembre de 2009). "Anuncio de Haskell 2010". Haskell (lista de correo) . Consultado el 12 de marzo de 2011 .
^ ab Riedel, Herbert (28 de abril de 2016). "ANN: Se ha formado el comité Haskell Prime 2020". Haskell-prime (lista de correo) . Consultado el 6 de mayo de 2017 .
^ abcdefghijklm Peyton Jones 2003, pág. xi
^ Norell, Ulf (2008). "Programación con tipos dependientes en Agda" (PDF) . Gotemburgo: Universidad Chalmers . Consultado el 9 de febrero de 2012 .
^ Hudak et al. 2007, págs. 12–38, 43.
^ Stroustrup, Bjarne ; Sutton, Andrew (2011). "Diseño de bibliotecas conceptuales para C++" (PDF) . Ingeniería del lenguaje de software . Archivado desde el original (PDF) el 10 de febrero de 2012.
^ abcdefghij Hudak y col. 2007, págs. 12-45-46.
^ ab Meijer, Erik (2006). "Confesiones de un vendedor de lenguajes de programación usados: cómo hacer que las masas se enganchen a Haskell". Oopsla 2007 . CiteSeerX 10.1.1.72.868 .
^ Meijer, Erik (1 de octubre de 2009). «C9 Lectures: Dr. Erik Meijer – Functional Programming Fundamentals, Chapter 1 of 13» (Conferencias C9: Dr. Erik Meijer – Fundamentos de programación funcional, Capítulo 1 de 13). Canal 9. Microsoft. Archivado desde el original el 16 de junio de 2012. Consultado el 9 de febrero de 2012 .
^ Drobi, Sadek (4 de marzo de 2009). "Erik Meijer on LINQ". InfoQ . QCon SF 2008: C4Media Inc. Consultado el 9 de febrero de 2012 .{{cite news}}: Mantenimiento de CS1: ubicación ( enlace )
^ Hickey, Rich. «Estantería de Clojure». Listmania!. Archivado desde el original el 3 de octubre de 2017. Consultado el 3 de octubre de 2017 .
^ Heller, Martin (18 de octubre de 2011). "No le hagas caso a Dart y huele el CoffeeScript". InfoWorld . Consultado el 15 de julio de 2020 .
^ "Programación declarativa en Escher" (PDF) . Consultado el 7 de octubre de 2015 .
^ Syme, Don ; Granicz, Adam; Cisternino, Antonio (2007). Expert F# . Apress . p. 2. F# también se nutre de Haskell, particularmente en lo que respecta a dos características avanzadas del lenguaje llamadas expresiones de secuencia y flujos de trabajo .
^ "Facebook presenta 'Hack', el lenguaje de programación del futuro". WIRED . 20 de marzo de 2014.
^ "Idris, un lenguaje de tipado dependiente" . Consultado el 26 de octubre de 2014 .
^ "LiveScript Inspiration" . Consultado el 4 de febrero de 2014 .
^ Freeman, Phil (2016). "PureScript by Example". Leanpub . Consultado el 23 de abril de 2017 .
^ Kuchling, AM "Functional Programming HOWTO". Documentación de Python v2.7.2 . Python Software Foundation . Consultado el 9 de febrero de 2012 .
^ "Glosario de términos y jerga". Perl Foundation Perl 6 Wiki . The Perl Foundation . Archivado desde el original el 21 de enero de 2012 . Consultado el 9 de febrero de 2012 .
^ "Influencias - La referencia de Rust". La referencia de Rust . Consultado el 31 de diciembre de 2023 .
^ Fogus, Michael (6 de agosto de 2010). "MartinOdersky lleva(5) a la lista". Enviar más paramédicos . Consultado el 9 de febrero de 2012 .
^ Lattner, Chris (3 de junio de 2014). "Página de inicio de Chris Lattner". Chris Lattner . Consultado el 3 de junio de 2014 . El lenguaje Swift es el producto del esfuerzo incansable de un equipo de expertos en lenguajes, gurús de la documentación, ninjas de la optimización de compiladores y un grupo interno de pruebas internas increíblemente importante que brindó comentarios para ayudar a refinar y probar ideas. Por supuesto, también se benefició enormemente de las experiencias ganadas con mucho esfuerzo por muchos otros lenguajes en el campo, tomando ideas de Objective-C, Rust, Haskell, Ruby, Python, C#, CLU y muchos otros para enumerarlos.
^ Chevalier, Tim (28 de enero de 2008). "¿Alguien puede decirme cómo se pronuncia "haskell"?". Haskell-cafe (lista de correo) . Consultado el 12 de marzo de 2011 .
^ Edward Kmett, Edward Kmett – Clases de tipos frente al mundo
^ Mossberg, Erik (8 de junio de 2020), erkmos/haskell-companies , consultado el 22 de junio de 2020
^ O'Sullivan, Bryan; Goerzen, John; Stewart, Donald Bruce (15 de noviembre de 2008). Real World Haskell: código en el que puedes creer. "O'Reilly Media, Inc.", págs. xxviii–xxxi. ISBN978-0-596-55430-9.
^ "Haskell en producción: Riskbook". Serokell Software Development Company . Consultado el 7 de septiembre de 2021 .
^ "Índice de popularidad de lenguajes de programación PYPL". pypl.github.io . Mayo de 2021. Archivado desde el original el 7 de mayo de 2021 . Consultado el 16 de mayo de 2021 .
^ Frederickson, Ben. "Ranking de lenguajes de programación por usuarios de GitHub". www.benfrederickson.com . Consultado el 6 de septiembre de 2019 .
^ abc Peyton Jones 2003, Prefacio.
^ Wadler, Philip (octubre de 1988). "Cómo hacer que el polimorfismo ad hoc sea menos ad hoc".
^ Peyton Jones, Simon (2003). "Usando el cilicio: una retrospectiva sobre Haskell". Microsoft .
^ "Haskell Wiki: Implementaciones" . Consultado el 18 de diciembre de 2012 .
^ "Bienvenido a Haskell'". Wiki de Haskell' . Archivado desde el original el 20 de febrero de 2016. Consultado el 11 de febrero de 2016 .
^ Equipo GHC 2020 (29 de octubre de 2021) Lanzamiento de GHC 9.2.1
^ Cambios propuestos en el compilador y el lenguaje para GHC y GHC/Haskell
^ Wadler, P.; Blott, S. (1989). "Cómo hacer que el polimorfismo ad hoc sea menos ad hoc". Actas del 16.º simposio ACM SIGPLAN-SIGACT sobre Principios de lenguajes de programación - POPL '89 . ACM . págs. 60–76. doi : 10.1145/75277.75283 . ISBN.978-0-89791-294-5. Número de identificación del sujeto 15327197.
^ Hallgren, T. (enero de 2001). "Diversión con dependencias funcionales o tipos como valores en cálculos estáticos en Haskell". Actas de la reunión de invierno conjunta CS/CE . Varberg, Suecia.
^ Juego de puntos de referencia del lenguaje informático
^ "Estadísticas de HackageDB". Hackage.haskell.org. Archivado desde el original el 3 de mayo de 2013. Consultado el 26 de junio de 2013 .
^ "Implementaciones" en la Wiki de Haskell
^ "El backend de LLVM". GHC Trac . 29 de marzo de 2019.
^ Terei, David A.; Chakravarty, Manuel MT (2010). "Un backend LLVM para GHC". Actas del Simposio ACM SIGPLAN Haskell 2010. ACM Press.
^ C. Ryder y S. Thompson (2005). "Cómo trasladar HaRe a la API de GHC"
^ Compilador Haskell de Utrecht
^ Hudak et al. 2007, págs. 12-22.
^ Agda 2, Comunidad Agda Github, 15 de octubre de 2021 , consultado el 16 de octubre de 2021
^ "La camarilla de Haskell" . Consultado el 8 de abril de 2015 .
^ "El equipo del sistema operativo Linspire/Freespire Core y Haskell". Lista de correo de Debian Haskell . Mayo de 2006. Archivado desde el original el 27 de diciembre de 2017. Consultado el 14 de junio de 2006 .
^ "Código en vivo con Tidal Cycles". Tidal Cycles . Consultado el 19 de enero de 2022 .
^ xmonad.org
^ "Gargantext – Principal". 13 de julio de 2023.
^ David, Chavalarias; et al. (8 de mayo de 2023). Hacia una agenda de investigación sobre medios digitales y bienestar humano (informe).
^ "Combatiendo el spam con Haskell". Código de Facebook . 26 de junio de 2015 . Consultado el 11 de agosto de 2019 .
^ "Haxl, una biblioteca para Haskell, se publica en código abierto". Código de Facebook . 10 de junio de 2014 . Consultado el 11 de agosto de 2019 .
^ "input-output-hk/cardano-node: El componente principal que se utiliza para participar en una cadena de bloques descentralizada de Cardano". GitHub . Consultado el 18 de marzo de 2022 .
^ Análisis y comparación de código fuente en varios lenguajes: github/semantic, GitHub, 7 de junio de 2019 , consultado el 7 de junio de 2019
^ "Informe del taller de programación funcional para usuarios comerciales" (PDF) . Consultado el 10 de junio de 2022 .
^ abcd En 2009 se completó una prueba formal de corrección funcional. Klein, Gerwin; Elphinstone, Kevin; Heiser, Gernot ; Andronick, June; Cock, David; Derrin, Philip; Elkaduwe, Dhammika; Engelhardt, Kai; Kolanski, Rafal; Norrish, Michael; Sewell, Thomas; Tuch, Harvey; Winwood, Simon (octubre de 2009). "seL4: verificación formal de un núcleo de SO" (PDF) . 22º Simposio ACM sobre Principios de Sistemas Operativos . Big Sky, Montana, EE. UU.
^ "Tikhon Jelvis: Haskell en Target". YouTube . 22 de abril de 2017.
^ "Por qué Co–Star usa Haskell". Co–Star . Consultado el 30 de septiembre de 2023 .
^ "Haskell en producción: Mercury". Serokell . Consultado el 11 de octubre de 2024 .
^ "Web/Frameworks – HaskellWiki". wiki.haskell.org . Consultado el 17 de septiembre de 2022 .
^ Jan-Willem Maessen. Eager Haskell: la ejecución limitada por recursos produce una iteración eficiente . Actas del taller SIGPLAN de 2002 de la Association for Computing Machinery (ACM) sobre Haskell.
^ [ enlace muerto ] Simon Peyton Jones. Llevando el cilicio: una retrospectiva sobre Haskell. Charla invitada en POPL 2003.
^ "La evaluación perezosa puede conducir a un rendimiento excelente, como en el juego The Computer Language Benchmarks". 27 de junio de 2006.
^ Heeren, Bastiaan; Leijen, Daan; van IJzendoorn, Arjan (2003). "Helio, para aprender Haskell" (PDF) . Actas del taller ACM SIGPLAN de 2003 sobre Haskell . págs. 62–71. doi : 10.1145/871895.871902. ISBN1581137583.S2CID11986908 .
^ "Documentación del compilador Helium". GitHub . Consultado el 9 de junio de 2023 .
^ "DDC – HaskellWiki". Haskell.org. 3 de diciembre de 2010. Consultado el 26 de junio de 2013 .
^ Ben Lippmeier, Inferencia de tipos y optimización para un mundo impuro, Universidad Nacional de Australia (2010) Tesis doctoral, capítulo 1
^ Robert Harper (25 de abril de 2011). "El sentido de la pereza".
^ Robert Harper (16 de abril de 2011). "Los módulos son lo más importante".
^ "Resolviendo el infierno de la Cábala". www.yesodweb.com . Consultado el 11 de agosto de 2019 .
^ "Anunciando nueva construcción de cabal: construcciones locales al estilo Nix" . Consultado el 1 de octubre de 2019 .
Peyton Jones, Simon , ed. (2003). Lenguaje y bibliotecas Haskell 98: el informe revisado. Cambridge University Press. ISBN 978-0521826143.
Marlow, Simon , ed. (2010). Informe sobre el lenguaje de Haskell 2010 (PDF) . Haskell.org.
Libros de texto
Davie, Antony (1992). Introducción a los sistemas de programación funcional con Haskell . Cambridge University Press. ISBN 978-0-521-25830-2.
Bird, Richard (1998). Introducción a la programación funcional con Haskell (2.ª edición). Prentice Hall Press. ISBN 978-0-13-484346-9.
Hudak, Paul (2000). La escuela de expresión Haskell: aprendizaje de programación funcional a través de multimedia. Nueva York: Cambridge University Press. ISBN 978-0521643382.
Hutton, Graham (2007). Programación en Haskell. Cambridge University Press. ISBN 978-0521692694.
O'Sullivan, Bryan; Stewart, Don; Goerzen, John (2008). Real World Haskell . Sebastopol: O'Reilly. ISBN 978-0-596-51498-3.Haskell en el mundo real (texto completo).
Thompson, Simon (2011). Haskell: El arte de la programación funcional (3.ª ed.). Addison-Wesley. ISBN 978-0201882957.
Lipovača, Miran (abril de 2011). ¡Aprenda a leer Haskell para el bien común! . San Francisco: No Starch Press. ISBN 978-1-59327-283-8.(texto completo)
Hudak, Paul ; Peterson, John; Fasel, Joseph (junio de 2000). "Una introducción sencilla a Haskell, versión 98". Haskell.org .
¡Aprenda a usar Haskell por el bien de todos! - Versión comunitaria ( learnyouahaskell.github.io) . Versión actualizada y mantenida por la comunidad de la famosa guía "Learn You a Haskell" (LYAH).
Daumé, Hal III. "Otro tutorial de Haskell" (PDF) . {{cite journal}}: Cite journal requiere |journal=( ayuda ) Supone mucho menos conocimiento previo que el tutorial oficial.
Yorgey, Brent (12 de marzo de 2009). "The Typeclassopedia" (PDF) . The Monad.Reader (13): 17–68.
Maguire, Sandy (2018). Pensar con tipos: programación a nivel de tipos en Haskell.