stringtranslate.com

Haskell

Haskell ( / ˈh æ s k əl / [25] ) es un lenguaje de programación funcional , de tipo estático , de propósito general , con inferencia de tipos y evaluación diferida . [26] [27] Diseñado para la enseñanza, la investigación y las aplicaciones industriales, Haskell ha sido pionero en varias características de los lenguajes de programación, como las clases de tipos , que permiten la sobrecarga de operadores de tipo seguro , y la entrada/salida (IO) monádica . Recibe su nombre en honor al lógico Haskell Curry . [1] La principal implementación de Haskell es el compilador Glasgow Haskell (GHC).

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 , Haskell era el 28.º lenguaje de programación más popular según las búsquedas de tutoriales en 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.

Las clases de tipos , que permiten la sobrecarga de operadores con seguridad de tipos , fueron propuestas por primera vez por Philip Wadler y Stephen Blott para abordar el manejo ad hoc de los tipos de igualdad y la sobrecarga aritmética en los lenguajes de la época. [35]

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).

Jerarquía de clases de tipos en el preludio de Haskell a partir de GHC 7.10. La inclusión de Folding y Traversable (con los cambios correspondientes en las firmas de tipos de algunas funciones), y de Applicative 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 , 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.

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]

Características

Haskell ofrece evaluación diferida , expresiones lambda , coincidencia de patrones , comprensión de listas , clases de tipos y polimorfismo de tipos . Es un lenguaje de programación puramente funcional , lo que significa que las funciones generalmente no tienen efectos secundarios . Existe una construcción distinta para representar los efectos secundarios, ortogonal al tipo de funciones. Una función pura puede devolver un efecto secundario que se ejecuta posteriormente, modelando las funciones impuras de otros lenguajes.

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]

El constructo que representa los efectos secundarios es un ejemplo de mónada : un marco general que puede modelar diversos cálculos, como el manejo de errores, el no determinismo , el análisis sintáctico y la memoria transaccional de software . Se definen como tipos de datos ordinarios, pero Haskell proporciona cierta sintaxis para su uso.

Haskell tiene una especificación abierta y publicada, [27] y existen múltiples implementaciones. Su implementación principal, Glasgow Haskell Compiler (GHC), es a la vez un intérprete y un compilador de código nativo que se ejecuta en la mayoría de las plataformas. GHC se destaca por su rico sistema de tipos que incorpora innovaciones recientes como tipos de datos algebraicos generalizados y familias de tipos. El Computer Language Benchmarks Game también destaca su implementación de alto rendimiento de concurrencia y paralelismo . [43]

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]

Ejemplos de código

Un programa "¡Hola, mundo!" en Haskell (solo la última línea es estrictamente necesaria):

módulo Main ( principal ) donde -- no es necesario en el intérprete, es el valor predeterminado en un archivo de módulo    main :: 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       

El uso del combinador de punto fijo de Haskell permite escribir esta función sin ninguna recursión explícita.

importar Data.Function ( corrección )  factorial = fix 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 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 )                

Implementaciones

Todas las implementaciones enumeradas se distribuyen bajo licencias de código abierto . [45]

Las implementaciones que cumplen total o casi totalmente con el estándar Haskell 98 incluyen:

Las implementaciones que ya no se mantienen activamente incluyen:

Las implementaciones que no son totalmente compatibles con Haskell 98 y que utilizan una variante del lenguaje Haskell incluyen:

Aplicaciones notables

Industria

Web

Entre los frameworks web más destacados escritos para Haskell se incluyen: [66]

Crítica

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. [67] [68] Además de consideraciones puramente prácticas como un mejor rendimiento, [69] 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". [70] 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. [71]

Ben Lippmeier diseñó Disciple [72] 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. [73] É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, [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 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. [76] Cabal en sí mismo 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 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:

Otros idiomas relacionados incluyen:

Las variantes notables de Haskell incluyen:

Conferencias y talleres

La comunidad Haskell se reúne periódicamente para realizar actividades de investigación y desarrollo. Los eventos principales son:

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. [79]

Referencias

  1. ^ abc Hudak y otros 2007.
  2. ^ ab Marlow, Simon (24 de noviembre de 2009). "Anuncio de Haskell 2010". Haskell (lista de correo) . Consultado el 12 de marzo de 2011 .
  3. ^ 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 .
  4. ^ abcdefghijklm Peyton Jones 2003, pág. xi
  5. ^ Norell, Ulf (2008). "Programación con tipos dependientes en Agda" (PDF) . Gotemburgo: Chalmers University . Consultado el 9 de febrero de 2012 .
  6. ^ Hudak et al. 2007, págs. 12–38, 43.
  7. ^ 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.
  8. ^ abcdefghij Hudak y otros, 2007, págs. 12-45–46.
  9. ^ 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 . 
  10. ^ 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 .
  11. ^ 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 )
  12. ^ Hickey, Rich. «Estantería de Clojure». Listmania!. Archivado desde el original el 3 de octubre de 2017. Consultado el 3 de octubre de 2017 .
  13. ^ 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 .
  14. ^ "Programación declarativa en Escher" (PDF) . Consultado el 7 de octubre de 2015 .
  15. ^ 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 .
  16. ^ "Facebook presenta 'Hack', el lenguaje de programación del futuro". WIRED . 20 de marzo de 2014.
  17. ^ "Idris, un lenguaje de tipado dependiente" . Consultado el 26 de octubre de 2014 .
  18. ^ "LiveScript Inspiration" . Consultado el 4 de febrero de 2014 .
  19. ^ Freeman, Phil (2016). "PureScript by Example". Leanpub . Consultado el 23 de abril de 2017 .
  20. ^ Kuchling, AM "Functional Programming HOWTO". Documentación de Python v2.7.2 . Python Software Foundation . Consultado el 9 de febrero de 2012 .
  21. ^ "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 .
  22. ^ "Influencias - La referencia de Rust". La referencia de Rust . Consultado el 31 de diciembre de 2023 .
  23. ^ 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 .
  24. ^ 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.
  25. ^ 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 .
  26. ^ Inferencia de tipos que originalmente utilizaba la inferencia de tipos Hindley-Milner
  27. ^ abc Peyton Jones 2003.
  28. ^ Edward Kmett, Edward Kmett – Clases de tipos frente al mundo
  29. ^ Mossberg, Erik (8 de junio de 2020), erkmos/haskell-companies , consultado el 22 de junio de 2020
  30. ^ 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. ISBN 978-0-596-55430-9.
  31. ^ "Haskell en producción: Riskbook". Serokell Software Development Company . Consultado el 7 de septiembre de 2021 .
  32. ^ "Í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 .
  33. ^ Frederickson, Ben. "Ranking de lenguajes de programación por usuarios de GitHub". www.benfrederickson.com . Consultado el 6 de septiembre de 2019 .
  34. ^ abc Peyton Jones 2003, Prefacio.
  35. ^ Wadler, Philip (octubre de 1988). "Cómo hacer que el polimorfismo ad hoc sea menos ad hoc".
  36. ^ Peyton Jones, Simon (2003). "El uso del cilicio: una retrospectiva sobre Haskell". Microsoft .
  37. ^ "Haskell Wiki: Implementaciones" . Consultado el 18 de diciembre de 2012 .
  38. ^ "Bienvenido a Haskell'". Wiki de Haskell' . Archivado desde el original el 20 de febrero de 2016. Consultado el 11 de febrero de 2016 .
  39. ^ Equipo GHC 2020 (29 de octubre de 2021) Lanzamiento de GHC 9.2.1
  40. ^ Cambios propuestos en el compilador y el lenguaje para GHC y GHC/Haskell
  41. ^ 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.S2CID 15327197  .
  42. ^ 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.
  43. ^ Juego de puntos de referencia del lenguaje informático
  44. ^ "Estadísticas de HackageDB". Hackage.haskell.org. Archivado desde el original el 3 de mayo de 2013. Consultado el 26 de junio de 2013 .
  45. ^ "Implementaciones" en Haskell Wiki
  46. ^ "El backend de LLVM". GHC Trac . 29 de marzo de 2019.
  47. ^ Terei, David A.; Chakravarty, Manuel MT (2010). "Un backend LLVM para GHC". Actas del Simposio ACM SIGPLAN Haskell 2010. ACM Press.
  48. ^ C. Ryder y S. Thompson (2005). "Cómo trasladar HaRe a la API de GHC"
  49. ^ Compilador Haskell de Utrecht
  50. ^ Hudak et al. 2007, págs. 12-22.
  51. ^ Agda 2, Comunidad Agda Github, 15 de octubre de 2021 , consultado el 16 de octubre de 2021
  52. ^ "La camarilla de Haskell" . Consultado el 8 de abril de 2015 .
  53. ^ "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 .
  54. ^ "Código en vivo con Tidal Cycles". Tidal Cycles . Consultado el 19 de enero de 2022 .
  55. ^ xmonad.org
  56. ^ "Gargantext – Principal". 13 de julio de 2023.
  57. ^ David, Chavalarias; et al. (8 de mayo de 2023). Hacia una agenda de investigación sobre medios digitales y bienestar humano (informe).
  58. ^ "Combatiendo el spam con Haskell". Código de Facebook . 26 de junio de 2015 . Consultado el 11 de agosto de 2019 .
  59. ^ "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 .
  60. ^ "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 .
  61. ^ 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
  62. ^ "Informe del taller de programación funcional para usuarios comerciales" (PDF) . Consultado el 10 de junio de 2022 .
  63. ^ 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.
  64. ^ "Tikhon Jelvis: Haskell en Target". YouTube . 22 de abril de 2017.
  65. ^ "Por qué Co–Star usa Haskell". Co–Star . Consultado el 30 de septiembre de 2023 .
  66. ^ "Web/Frameworks – HaskellWiki". wiki.haskell.org . Consultado el 17 de septiembre de 2022 .
  67. ^ 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.
  68. ^ [ enlace roto ] Simon Peyton Jones. Llevando el cilicio: una retrospectiva sobre Haskell. Charla invitada en POPL 2003.
  69. ^ "La evaluación perezosa puede conducir a un rendimiento excelente, como en el juego The Computer Language Benchmarks". 27 de junio de 2006.
  70. ^ 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. ISBN 1581137583.S2CID11986908  .​
  71. ^ "Documentación del compilador Helium". GitHub . Consultado el 9 de junio de 2023 .
  72. ^ "DDC – HaskellWiki". Haskell.org. 3 de diciembre de 2010. Consultado el 26 de junio de 2013 .
  73. ^ Ben Lippmeier, Inferencia de tipos y optimización para un mundo impuro, Universidad Nacional de Australia (2010) Tesis doctoral, capítulo 1
  74. ^ Robert Harper (25 de abril de 2011). "El sentido de la pereza". Icono de acceso cerrado
  75. ^ Robert Harper (16 de abril de 2011). "Los módulos son lo más importante". Icono de acceso cerrado
  76. ^ "Resolviendo el infierno de la Cábala". www.yesodweb.com . Consultado el 11 de agosto de 2019 .
  77. ^ "Anunciando nueva construcción de cabal: construcciones locales al estilo Nix" . Consultado el 1 de octubre de 2019 .
  78. ^ https://zfoh.ch/ [ URL básica ]
  79. ^ "Hackatón – HaskellWiki".

Bibliografía

Informes
Libros de texto
Tutoriales
Historia

Enlaces externos