stringtranslate.com

Haskell

Haskell ( / ˈ h æ s k əl / [25] ) es un lenguaje de programación puramente funcional , de tipo estático y de propósito general con inferencia de tipos y evaluación diferida . [26] [27] Diseñado para la enseñanza, la investigación y aplicaciones industriales, Haskell ha sido pionero en una serie de características de lenguaje de programación, como clases de tipos , que permiten la sobrecarga de operadores con seguridad de tipos , y entrada/salida monádica (IO). Lleva el nombre del lógico Haskell Curry . [1] La implementación principal 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 de lenguaje.

Haskell se utiliza en el mundo académico y la industria. [29] [30] [31] En mayo de 2021 , 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.

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

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]

Características

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

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]

La construcción que representa los efectos secundarios es un ejemplo de mónada : un marco general que puede modelar varios 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 algo de azúcar sintáctico para su uso.

Haskell tiene una especificación abierta y publicada [27] y existen múltiples implementaciones. Su implementación principal, el 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 juego Computer Language Benchmarks también destaca su implementación de alto rendimiento de concurrencia y paralelismo . [43]

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]

Ejemplos de código

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

módulo principal ( 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 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       

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

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 )                

Implementaciones

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

Las implementaciones que cumplen total o casi 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

Los marcos web notables escritos para Haskell incluyen: [66]

Crítica

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:

Otros idiomas relacionados incluyen:

Las variantes notables de Haskell incluyen:

Conferencias y talleres

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

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

  1. ^ a b C Hudak et al. 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 escrita de forma dependiente en Agda" (PDF) . Gotemburgo: Universidad Chalmers . Consultado el 9 de febrero de 2012 .
  6. ^ Hudak y otros. 2007, págs. 12–38, 43.
  7. ^ 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.
  8. ^ abcdefghij Hudak y col. 2007, págs. 12-45-46.
  9. ^ 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 . 
  10. ^ 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 .
  11. ^ 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 )
  12. ^ 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 .
  13. ^ Heller, Martín (18 de octubre de 2011). "Desprecia a Dart y huele CoffeeScript". InfoMundo . 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). 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 .
  16. ^ "Facebook presenta 'Hack', el lenguaje de programación del futuro". CABLEADO . 20 de marzo de 2014.
  17. ^ "Idris, un lenguaje escrito de forma dependiente" . Consultado el 26 de octubre de 2014 .
  18. ^ "Inspiración de LiveScript" . Consultado el 4 de febrero de 2014 .
  19. ^ Freeman, Phil (2016). "PureScript con el ejemplo". Leanpub . Consultado el 23 de abril de 2017 .
  20. ^ 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 .
  21. ^ "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 .
  22. ^ "Influencias: la referencia de Rust". La referencia del óxido . Consultado el 31 de diciembre de 2023 .
  23. ^ 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 .
  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 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.
  25. ^ 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 .
  26. ^ Inferencia de tipos utilizando originalmente la inferencia de tipos Hindley-Milner
  27. ^ a B C Peyton Jones 2003.
  28. ^ Edward Kmett, Edward Kmett - Clases tipográficas contra el 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). Haskell en el mundo real: 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: libro de riesgos". Empresa de desarrollo de software Serokell . Consultado el 7 de septiembre de 2021 .
  32. ^ "Í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 .
  33. ^ Frederickson, Ben. "Clasificación 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, Simón (2003). "Usar el cilicio: una retrospectiva de Haskell". Microsoft .
  37. ^ "Haskell Wiki: implementaciones" . Consultado el 18 de diciembre de 2012 .
  38. ^ "Bienvenido a Haskell'". La 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 de lenguaje y compilador propuestos 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 conjunta de invierno 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". Trac GHC . 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 . Prensa ACM.
  48. ^ C. Ryder y S. Thompson (2005). "Transferencia de HaRe a la API de GHC"
  49. ^ Compilador Utrecht Haskell
  50. ^ Hudak y otros. 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 Cábala de Haskell" . Consultado el 8 de abril de 2015 .
  53. ^ "Equipo de Linspire/Freespire Core OS y Haskell". Lista de correo de Debian Haskell . Mayo de 2006.
  54. ^ "Código en vivo con Tidal Cycles | Tidal Cycles". doc.tidalcycles.org . Consultado el 19 de enero de 2022 .
  55. ^ xmonad.org
  56. ^ "Gargantexto / 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 de la humanidad (informe).
  58. ^ "Luchando contra el spam con Haskell". Código de Facebook . 26 de junio de 2015 . Consultado el 11 de agosto de 2019 .
  59. ^ "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 .
  60. ^ "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 .
  61. ^ 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
  62. ^ "Informe del taller de usuarios comerciales de programación funcional" (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 ; 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.
  64. ^ "Tikhon Jelvis: Haskell en el objetivo". YouTube .
  65. ^ "Por qué Co–Star usa Haskell". Co-estrella . Consultado el 30 de septiembre de 2023 .
  66. ^ "Web/Marcos - HaskellWiki". wiki.haskell.org . Consultado el 17 de septiembre de 2022 .
  67. ^ 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.
  68. ^ [ enlace muerto ] Simon Peyton Jones. Usando el cilicio: una retrospectiva sobre Haskell. Charla invitada en POPL 2003.
  69. ^ "La evaluación diferida puede conducir a un rendimiento excelente, como en The Computer Language Benchmarks Game". 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. S2CID  11986908.
  71. ^ "Documentos del compilador de helio". 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, Tesis doctoral de la Universidad Nacional de Australia (2010), capítulo 1
  74. ^ Robert Harper (25 de abril de 2011). "El punto 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. ^ "Resolver el infierno de la cábala". www.yesodweb.com . Consultado el 11 de agosto de 2019 .
  77. ^ "Anuncio de nueva construcción de Cabal: compilaciones locales estilo Nix" . Consultado el 1 de octubre de 2019 .
  78. ^ https://zfoh.ch/
  79. ^ "Hackatón - HaskellWiki".

Bibliografía

Informes
Libros de texto
Tutoriales
Historia

enlaces externos