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 de lenguaje.
Haskell se utiliza en el mundo académico y la industria. [29] [30] [31] En mayo de 2021 [actualizar], Haskell ocupaba el puesto 28.º lenguaje de programación más popular según las búsquedas de tutoriales de Google , [32] y constituía 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, creció el interés en los lenguajes funcionales perezosos. En 1987, existían más de una docena de lenguajes de programación no estrictos y puramente funcionales. Miranda era el más utilizado, pero era software propietario . En la conferencia sobre Lenguajes de Programación Funcional y Arquitectura de Computadores (FPCA '87) en Portland, Oregon , hubo un fuerte consenso en 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é, intentando reunir soluciones listas para usar cuando fuera posible.
En las primeras versiones de Haskell, hasta la versión 1.2 inclusive, la interacción del usuario y la IO (entrada y salida) se manejaban mediante mecanismos basados en flujos y en continuación, que se consideraban ampliamente insatisfactorios. [36] En la versión 1.3, se introdujo IO monádica , junto con la generalización de clases de tipos a tipos superiores (constructores de tipos). Junto con la "notación do", que proporciona azúcar sintáctica para la clase de tipo 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 usa en lenguajes diferidos para evitar el consumo excesivo de memoria; pasando de una clase de tipo a una función estándar para 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 de lenguaje (1.0, 1.1, 1.2, 1.3, 1.4).
Jerarquía de clases de tipos en el preludio de Haskell a partir de GHC 7.10. La inclusión de Plegable y Traversable (con los cambios correspondientes en las firmas de tipo de algunas funciones) y de Aplicativo como intermedio entre Functor y Monad, son desviaciones del estándar Haskell 2010.
Haskell 98
A finales de 1997, la serie culminó en Haskell 98 , cuyo objetivo era especificar una versión estable, mínima y portátil del lenguaje y una biblioteca estándar adjunta para la enseñanza y como base para futuras extensiones. El comité acogió expresamente la creación de extensiones y variantes de Haskell 98 mediante la adición e incorporación de funciones experimentales. [34]
En febrero de 1999, el estándar de 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]
Haskel 2010
A principios de 2006, comenzó el proceso de definición de un sucesor del estándar Haskell 98, informalmente denominado Haskell Prime . [38] Se pretendía que este fuera un proceso incremental continuo para revisar la definición del lenguaje, produciendo una nueva revisión hasta una vez por año. La primera revisión, denominada 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 en su mayoría incorpora varias características bien utilizadas y no controvertidas previamente habilitadas a través de indicadores específicos del compilador.
Nombres de módulos jerárquicos. Se permite que los nombres de los módulos consistan en secuencias separadas por puntos de identificadores en mayúscula, en lugar de un solo identificador de este tipo. Esto permite que los módulos reciban nombres de forma jerárquica (por ejemplo, Data.Listen lugar de List), aunque técnicamente los módulos todavía están 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ó universalmente.
La interfaz de función externa (FFI) permite enlaces a otros lenguajes de programación. En el Informe sólo se especifican enlaces a C , pero el diseño permite enlaces a otros idiomas. Para respaldar esto, se permitió que las declaraciones de tipos de datos no contuvieran constructores, lo que permitió 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 Haskell 98 y se usó ampliamente.
Ya no se permitían los llamados patrones n + k (definiciones de la forma ). fact (n+1) = (n+1) * fact nEste azúcar sintáctico tenía una semántica engañosa, en la que el código parecía usar el (+)operador, pero en realidad desazucaraba para codificar usando (-)y (>=).
Las reglas de inferencia de tipos se relajaron para permitir que más programas realizaran comprobaciones de tipos.
El LANGUAGEpragma estaba especificado. En 2010, se utilizaban ampliamente docenas de extensiones del lenguaje y GHC (entre otros compiladores) proporcionó la LANGUAGEpragma para especificar extensiones individuales con una lista de identificadores. Se requieren compiladores de Haskell 2010 para admitir la Haskell2010extensión y se les recomienda que admitan varias otras, que corresponden a extensiones agregadas en Haskell 2010.
Estándares futuros
La próxima especificación formal estaba prevista 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 esta no es una especificación de lenguaje formal, combina una serie de extensiones GHC estables y ampliamente utilizadas para Haskell 2010. [39] [40]
Haskell tiene un fuerte sistema de tipos estáticos basado en la inferencia de tipos Hindley-Milner . Su principal innovación en esta área son las clases de tipos, originalmente concebidas como una forma basada en principios de agregar sobrecarga al lenguaje, [41] pero desde entonces se han encontrado muchos más usos. [42]
Existe una comunidad activa y en crecimiento en torno al idioma, 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 principal ( principal ) donde : no es necesario en el intérprete, es el valor predeterminado en un archivo de módulomain :: IO () - el compilador puede inferir la definición de este 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 recursividad (con la expresión "ifthenelse") factorial n = si n < 2 entonces 1 si no n * factorial ( n - 1 )-- Usando recursividad (con coincidencia de patrones) factorial 0 = 1 factorial n = n * factorial ( n - 1 )-- Usando recursividad (con guardias) factorial n | norte < 2 = 1 | en caso contrario = n * factorial ( n - 1 )-- Usando una lista y la función "producto" factorial n = producto [ 1 .. n ]-- Usando factorial fold (implementa "producto") n = foldl ( * ) 1 [ 1 .. n ]-- Factorial de estilo sin puntos = foldr ( * ) 1 . enumeraciónDeA1
importar datos.Función ( arreglar )factorial = arreglar fac donde fac f x | x < 2 = 1 | en caso 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 a la clasificación rápida de listas, donde el primer elemento se toma como pivote:
-- Escriba anotación (opcional, igual para cada implementación) QuickSort :: Ord a => [ a ] -> [ a ]- Usando listas por comprensión QuickSort [] = [] - La lista vacía ya está ordenada QuickSort ( x : xs ) = QuickSort [ a | a <- xs , a < x ] - Ordenar la parte izquierda de la lista ++ [ x ] ++ - Insertar 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 ( filtro ( < x ) xs ) ++ [ x ] ++ QuickSort ( filtro ( >= x ) xs )
Las implementaciones que cumplen total o casi con el estándar Haskell 98 incluyen:
El compilador Glasgow Haskell (GHC) compila en código nativo en muchas arquitecturas de procesador diferentes y en ANSI C , a través de uno de dos lenguajes intermedios : C-- , o en versiones más recientes, código de bits LLVM (anteriormente máquina virtual de bajo nivel). [46] [47] GHC se ha convertido en el dialecto estándar de facto de Haskell. [48] Hay bibliotecas (por ejemplo, enlaces a OpenGL ) que funcionan sólo con GHC. GHC también se distribuyó con la plataforma Haskell .
Jhc, un compilador de Haskell escrito por John Meacham, enfatiza la velocidad y eficiencia de los programas generados y la exploración de 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] Es compatible con casi todas las funciones de Haskell 98 además de muchas extensiones experimentales. Se implementa mediante gramáticas de atributos y se utiliza principalmente para la investigación de 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 código de bytes . Alguna vez fue una de las implementaciones más utilizadas, junto con el compilador GHC, [50] pero ahora ha sido reemplazada en su mayor parte por GHCi. También viene con una biblioteca de gráficos.
HBC es una implementación temprana que admite Haskell 1.4. Fue implementado por Lennart Augustsson en Lazy ML y basado en él . Hace algún tiempo que no se desarrolla activamente.
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 portátil y eficiente, e integrar soporte para Hat, el rastreador de Haskell. También tenía un backend de JavaScript , que permitía a los usuarios ejecutar programas de 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. Es reemplazado por el sistema Gofer del usuario de Haskell (Hugs).
Helio, un dialecto más nuevo de Haskell. La atención se centra en facilitar el aprendizaje a través de mensajes de error más claros al deshabilitar las clases de tipos de forma predeterminada.
Aplicaciones notables
El asistente de pruebas Agda está escrito en Haskell. [51]
Cabal es una herramienta para construir y empaquetar bibliotecas y programas de 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.
GHC también suele ser un banco de pruebas para optimizaciones y funciones de programación funcional avanzada en otros lenguajes de programación.
Git-annex es una herramienta para administrar archivos de (grandes) datos bajo el control de versiones de Git . También proporciona un sistema distribuido de sincronización de archivos (asistente git-annex).
Linspire Linux eligió Haskell para el desarrollo de herramientas del sistema. [53]
Pandoc es una herramienta para convertir un formato de marcado a otro.
GarganText [56] es una herramienta colaborativa para mapear textos de análisis semántico 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]
Industria
Bluespec SystemVerilog (BSV) es un lenguaje para el diseño de semiconductores que es una extensión de Haskell. Además, las herramientas de Bluespec, Inc. están implementadas en Haskell. Tenga en cuenta que este es un ejemplo de un lenguaje específico de dominio integrado en Haskell
Cryptol , un lenguaje y una 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 análisis, diferenciació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 cual razonar, para su traducción automática por parte de la herramienta de demostración de teoremas. [63] : p.3 El código Haskell sirvió así como un prototipo intermedio antes del refinamiento final en C. [63] : pág.3
Jan-Willem Maessen, en 2002, y Simon Peyton Jones , en 2003, discutieron los problemas asociados con la evaluación perezosa, reconociendo al mismo tiempo los motivos teóricos para ello. [67] [68] Además de consideraciones puramente prácticas como el rendimiento mejorado, [69] señalan que la evaluación diferida hace que sea más difícil para los programadores razonar sobre el rendimiento de su código (particularmente su uso del espacio).
Bastiaan Heeren, Daan Leijen y Arjan van IJzendoorn en 2003 también observaron 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." [70] Para abordar los mensajes de error, 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. [71]
Ben Lippmeier diseñó Disciple [72] como un dialecto estricto por defecto (perezoso mediante 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 las mutables. matrices. [73] 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 una nuevo valor para 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 ellos 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, [74] y la "inferioridad" del (antiguo) sistema de clases de Haskell en comparación con el sistema de módulos de ML. [75]
La herramienta de compilación de Haskell, Cabal , ha sido históricamente criticada por manejar mal múltiples versiones de la misma biblioteca, un problema conocido como "Cabal hell". El servidor Stackage y la herramienta de compilación Stack se crearon en respuesta a estas críticas. [76] El propio Cabal ahora tiene un sistema de compilación mucho más sofisticado, fuertemente inspirado en Nix , [77] que se convirtió en el predeterminado con la versión 3.0.
Idiomas relacionados
Clean es un pariente cercano y un poco mayor de Haskell. Su mayor desviación de Haskell está en el uso de tipos de unicidad en lugar de mónadas para 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 integrados 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 en los buzones, y una descripción de mapeo de las salidas a los canales como cableado de caja, con un Lenguaje de expresión y sintaxis similar a Haskell.
Conferencias y talleres
La comunidad de Haskell se reúne periódicamente para realizar actividades de investigación y desarrollo. Los principales eventos son:
ZuriHac, [78] especie de Hackathon que se celebra cada año en Zurich
A partir de 2006, se han organizado una serie de hackathons , la serie Hac, cuyo objetivo es mejorar las herramientas y bibliotecas del lenguaje de programación. [79]
Referencias
^ a b C Hudak et al. 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 escrita de forma dependiente en Agda" (PDF) . Gotemburgo: Universidad Chalmers . Consultado el 9 de febrero de 2012 .
^ Hudak y otros. 2007, págs. 12–38, 43.
^ Stroustrup, Bjarne ; Sutton, Andrés (2011). "Diseño de Bibliotecas de Conceptos 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: enganchar a las masas con Haskell". Upsla 2007 . CiteSeerX 10.1.1.72.868 .
^ Meijer, Erik (1 de octubre de 2009). "Conferencias C9: Dr. Erik Meijer - Fundamentos de programación funcional, Capítulo 1 de 13". Canal 9 . Microsoft . Consultado el 9 de febrero de 2012 .
^ Drobi, Sadek (4 de marzo de 2009). "Erik Meijer en LINQ". InfoQ . QCon SF 2008: C4Media Inc. Consultado el 9 de febrero de 2012 .{{cite news}}: Mantenimiento CS1: ubicación ( enlace )
^ Chupetón, rico. "Estantería Clojure". ¡Listmanía! . Archivado desde el original el 3 de octubre de 2017 . Consultado el 3 de octubre de 2017 .
^ Heller, Martín (18 de octubre de 2011). "Desprecia a Dart y huele CoffeeScript". InfoMundo . 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). Experto F# . Presione . pag. 2. F# también se basa en 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". CABLEADO . 20 de marzo de 2014.
^ "Idris, un lenguaje escrito de forma dependiente" . Consultado el 26 de octubre de 2014 .
^ "Inspiración de LiveScript" . Consultado el 4 de febrero de 2014 .
^ Freeman, Phil (2016). "PureScript con el ejemplo". Leanpub . Consultado el 23 de abril de 2017 .
^ Kuchling, AM "CÓMO de programación funcional". Documentación de Python v2.7.2 . Fundación de software Python . Consultado el 9 de febrero de 2012 .
^ "Glosario de términos y jerga". Fundación Perl Perl 6 Wiki . La Fundación Perl . Archivado desde el original el 21 de enero de 2012 . Consultado el 9 de febrero de 2012 .
^ "Influencias: la referencia de Rust". La referencia del óxido . Consultado el 31 de diciembre de 2023 .
^ Fogus, Michael (6 de agosto de 2010). "MartinOdersky lleva (5) a la lista". Envíe 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 lenguaje, gurús de la documentación, ninjas de optimización de compiladores y un grupo interno increíblemente importante de pruebas internas que brindaron comentarios para ayudar a refinar y probar ideas. Por supuesto, también se benefició enormemente de las experiencias ganadas con esfuerzo por muchos otros lenguajes en el campo, extrayendo 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 la pronunciación de" haskell "?". Haskell-cafe (lista de correo) . Consultado el 12 de marzo de 2011 .
^ Edward Kmett, Edward Kmett - Clases tipográficas contra el 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). Haskell en el mundo real: código en el que puedes creer. "O'Reilly Media, Inc.". págs. xxviii-xxxi. ISBN978-0-596-55430-9.
^ "Haskell en producción: libro de riesgos". Empresa de desarrollo de software Serokell . Consultado el 7 de septiembre de 2021 .
^ "Índice de popularidad del lenguaje 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. "Clasificación 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, Simón (2003). "Usar el cilicio: una retrospectiva de Haskell". Microsoft .
^ "Haskell Wiki: implementaciones" . Consultado el 18 de diciembre de 2012 .
^ "Bienvenido a Haskell'". La 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 de lenguaje y compilador propuestos 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 . ISBN978-0-89791-294-5. S2CID 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 conjunta de invierno 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 Haskell Wiki
^ "El backend de LLVM". Trac GHC . 29 de marzo de 2019.
^ Terei, David A.; Chakravarty, Manuel MT (2010). "Un backend LLVM para GHC". Actas del Simposio ACM SIGPLAN Haskell 2010 . Prensa ACM.
^ C. Ryder y S. Thompson (2005). "Transferencia de HaRe a la API de GHC"
^ Compilador Utrecht Haskell
^ Hudak y otros. 2007, págs. 12-22.
^ Agda 2, Comunidad Agda Github, 15 de octubre de 2021 , consultado el 16 de octubre de 2021
^ "La Cábala de Haskell" . Consultado el 8 de abril de 2015 .
^ "Equipo de Linspire/Freespire Core OS y Haskell". Lista de correo de Debian Haskell . Mayo de 2006.
^ "Código en vivo con Tidal Cycles | Tidal Cycles". doc.tidalcycles.org . Consultado el 19 de enero de 2022 .
^ xmonad.org
^ "Gargantexto / 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 de la humanidad (informe).
^ "Luchando contra el spam con Haskell". Código de Facebook . 26 de junio de 2015 . Consultado el 11 de agosto de 2019 .
^ "Haxl de código abierto, una biblioteca para Haskell". Código de Facebook . 10 de junio de 2014 . Consultado el 11 de agosto de 2019 .
^ "input-output-hk/cardano-node: el componente central que se utiliza para participar en una cadena de bloques descentralizada de Cardano". GitHub . Consultado el 18 de marzo de 2022 .
^ Análisis, análisis y comparación de código fuente en muchos idiomas: github/semantic, GitHub, 7 de junio de 2019 , consultado el 7 de junio de 2019
^ "Informe del taller de usuarios comerciales de programación funcional" (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 ; Andrónico, junio; Polla, David; Derrin, Felipe; Elkaduwe, Dhammika; Engelhardt, Kai; Kolanski, Rafal; Norris, Michael; Sewell, Thomas; Tuch, Harvey; Winwood, Simon (octubre de 2009). "seL4: Verificación formal de un kernel de sistema operativo" (PDF) . 22º Simposio ACM sobre principios de sistemas operativos . Big Sky, MT, EE. UU.
^ "Tikhon Jelvis: Haskell en el objetivo". YouTube .
^ "Por qué Co–Star usa Haskell". Co-estrella . Consultado el 30 de septiembre de 2023 .
^ "Web/Marcos - HaskellWiki". wiki.haskell.org . Consultado el 17 de septiembre de 2022 .
^ Jan-Willem Maessen. "Haskell ansioso: la ejecución limitada por recursos produce una iteración eficiente ". Actas del taller SIGPLAN de 2002 de la Asociación de Maquinaria de Computación (ACM) sobre Haskell.
^ [ enlace muerto ] Simon Peyton Jones. Usando el cilicio: una retrospectiva sobre Haskell. Charla invitada en POPL 2003.
^ "La evaluación diferida puede conducir a un rendimiento excelente, como en The Computer Language Benchmarks Game". 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. S2CID 11986908.
^ "Documentos del compilador de helio". GitHub . Consultado el 9 de junio de 2023 .
^ "DDC-HaskellWiki". Haskell.org. 3 de diciembre de 2010 . Consultado el 26 de junio de 2013 .
Davie, Antonio (1992). Introducción a los sistemas de programación funcional utilizando Haskell . Prensa de la Universidad de Cambridge. ISBN 978-0-521-25830-2.
Pájaro, Richard (1998). Introducción a la programación funcional utilizando Haskell (2ª ed.). Prensa de Prentice Hall. 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. Prensa de la Universidad de Cambridge. ISBN 978-0521692694.
O'Sullivan, Bryan; Stewart, Don; Goerzen, John (2008). Haskell del mundo real . Sebastopol: O'Reilly. ISBN 978-0-596-51498-3.Haskell del mundo real (texto completo).
Thompson, Simón (2011). Haskell: el arte de la programación funcional (3ª ed.). Addison-Wesley. ISBN 978-0201882957.
Lipovača, Miran (abril de 2011). ¡Aprende Haskell para un gran bien! . San Francisco: No Starch Press. ISBN 978-1-59327-283-8.(texto completo)
Hudak, Pablo ; Peterson, Juan; Fasel, Joseph (junio de 2000). "Una suave introducción a Haskell, versión 98". Haskell.org .
¡Aprende Haskell para un gran bien! - Una versión comunitaria ( learnyouahaskell.github.io) . Una versión actualizada mantenida por la comunidad de la reconocida guía "Learn You a Haskell" (LYAH).
Daumé, Hal III. "Otro tutorial más de Haskell" (PDF) . {{cite journal}}: Cite Journal requiere |journal=( ayuda ). Asume muchos menos conocimientos previos que el tutorial oficial.
Yorgey, Brent (12 de marzo de 2009). "La clase de tipos" (PDF) . El lector de mónadas (13): 17–68.
Maguire, Sandy (2018). Pensando con tipos: programación a nivel de tipos en Haskell.