Haskell / h æ s k əl / [27] es una de propósito general , estático de tipos , puramente funcional lenguaje de programación con la inferencia de tipos y evaluación perezosa . [28] [29] Diseñado para la enseñanza, la investigación y la aplicación industrial, Haskell ha sido pionero en una serie de características avanzadas del lenguaje de programación, como las clases de tipos , que permiten la sobrecarga de operadores con seguridad de tipos . La implementación principal de Haskell es Glasgow Haskell Compiler (GHC). Lleva el nombre deel lógico Haskell Curry . [1]
Paradigma | Puramente funcional |
---|---|
Diseñada por | Lennart Augustsson , Dave Barton, Brian Boutel, Warren Burton, Joseph Fasel, Kevin Hammond, Ralf Hinze, Paul Hudak , John Hughes , Thomas Johnsson, Mark Jones, Simon Peyton Jones , John Launchbury , Erik Meijer , John Peterson, Alastair Reid, Colin Runciman, Philip Wadler |
Apareció por primera vez | 1990 [1] |
Lanzamiento estable | Haskell 2010 [2] / julio de 2010 |
Versión de vista previa | Haskell 2020 anunciado [3] |
Disciplina de mecanografía | Inferido , estático , fuerte |
SO | Multiplataforma |
Extensiones de nombre de archivo | .hs, .lhs |
Sitio web | www |
Implementaciones importantes | |
GHC , abrazos , NHC, JHC, Yhc , UHC | |
Dialectos | |
Helio , Gofer | |
Influenciado por | |
Limpio , [4] FP , [4] Gofer , [4] Esperanza y esperanza + , [4] Id , [4] ISWIM , [4] KRC , [4] Lisp , [4] Miranda , [4] ML y ML estándar , [4] Orwell , SASL , [4] Scheme , [4] SISAL [4] | |
Influenciado | |
Agda , [5] Bluespec , [6] C ++ 11 / Concepts , [7] C # / LINQ , [8] [9] [10] [11] CAL, [ cita requerida ] Cayenne , [8] Clean , [ 8] Clojure , [12] CoffeeScript , [13] Curry , [8] Elm , Epigram , [ cita requerida ] Escher , [14] F # , [15] Frege , [16] Hack , [17] Idris , [18] Isabelle , [8] Java / Generics , [8] LiveScript , [19] Mercury , [8] Ωmega , PureScript , [20] Python , [8] [21] Raku , [22] Rust , [23] Scala , [ 8] [24] Swift , [25] Timber , [26] Visual Basic 9.0 [8] [9] |
La semántica de Haskell se basa históricamente en la del lenguaje de programación Miranda , que sirvió para enfocar los esfuerzos del grupo de trabajo inicial de Haskell. [30] La última especificación formal del lenguaje se realizó en julio de 2010, mientras que el desarrollo de GHC ha ampliado Haskell a través de extensiones de lenguaje. La próxima especificación formal estaba prevista para 2020. [3] [ necesita actualización ]
Haskell se utiliza en la academia y la industria. [31] [32] En septiembre de 2020, Haskell era el 21º lenguaje de programación más popular en términos de búsquedas de Google [33] para tutoriales y representaba menos del 1% de los usuarios activos en el repositorio de código fuente de GitHub. [34]
Historia
Tras el lanzamiento de Miranda por Research Software Ltd. en 1985, creció el interés por 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 un software propietario . En la conferencia sobre lenguajes de programación funcional y arquitectura informática (FPCA '87) en Portland, Oregon , hubo un fuerte consenso de 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 de base para futuras investigaciones en el diseño de lenguajes funcionales. [35]
Haskell 1.0 a 1.4
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 Standard ML, pero se implementaron por primera vez en Haskell entre 1987 y la versión 1.0. [36] [37]
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).
Haskell 98
A finales de 1997, la serie culminó en Haskell 98 , con la intención de 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é expresó su satisfacción por la creación de extensiones y variantes de Haskell 98 mediante la adición e incorporación de funciones experimentales. [35]
En febrero de 1999, el estándar de lenguaje Haskell 98 se publicó originalmente como The Haskell 98 Report . [35] En enero de 2003, se publicó una versión revisada como Haskell 98 Language and Libraries: The Revised Report . [29] El lenguaje continúa evolucionando rápidamente, con la implementación de Glasgow Haskell Compiler (GHC) que representa el estándar de facto actual . [38]
Haskell 2010
A principios de 2006 , comenzó el proceso de definir un sucesor del estándar Haskell 98, informalmente llamado Haskell Prime . [39] 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 al 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, en su mayoría incorporando 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 solo uno de esos identificadores. Esto permite que los módulos sean nombrados de manera jerárquica (por ejemplo, en
Data.List
lugar deList
), aunque técnicamente los módulos todavía están en un solo espacio de nombres monolítico. Esta extensión se especificó en un apéndice de Haskell 98 y en la práctica se usó universalmente. - La interfaz de función externa (FFI) permite enlaces a otros lenguajes de programación. En el informe solo se especifican los enlaces a C , pero el diseño permite otros enlaces de idioma. Para respaldar esto, se permitió que las declaraciones de tipos de datos no contengan constructores, lo que permite tipos robustos de nonce para datos externos que no se pueden construir en Haskell. Esta extensión también se especificó previamente en un Apéndice al Informe Haskell 98 y se usó ampliamente.
- Ya no se permitían los denominados patrones n + k (definiciones de la forma
fact (n+1) = (n+1) * fact n
). Este azúcar sintáctico tenía una semántica engañosa, en la que el código parecía que usaba el(+)
operador, pero de hecho no codificaba usando(-)
y(>=)
. - Las reglas de la inferencia de tipos se relajaron para permitir que más programas realizaran la verificación de tipos.
- Se solucionaron algunos problemas de sintaxis (cambios en la gramática formal): se agregaron protecciones de patrones, lo que permitió la coincidencia de patrones dentro de las protecciones; la resolución de la fijeza del operador se especificó de una manera más simple que refleja la práctica real; Se abordó un caso límite en la interacción de la sintaxis léxica de operadores y comentarios del lenguaje , y se modificó la interacción de notación do y si-entonces-más para eliminar errores de sintaxis inesperados.
- Se especificó el
LANGUAGE
pragma . Para el 2010, decenas de extensiones del lenguaje se usaban ampliamente, y GHC (entre otros compiladores) proporcionó elLANGUAGE
pragma para especificar extensiones individuales con una lista de identificadores. Se requiere que los compiladores de Haskell 2010 admitan laHaskell2010
extensión y se les recomienda que admitan varios otros, que corresponden a las extensiones agregadas en Haskell 2010.
Características
Haskell presenta evaluación perezosa , 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 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 fuerte , estática sistema de tipos basado en Hindley-Milner inferencia de tipos . Su principal innovación en esta área son las clases de tipos, originalmente concebidas como una forma de agregar sobrecarga al lenguaje, [40] pero desde entonces han encontrado muchos más usos. [41]
La construcción que representa los efectos secundarios es un ejemplo de una mónada : un marco general que puede modelar varios cálculos, como manejo de errores, no determinismo , análisis sintáctico y 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, [29] y existen múltiples implementaciones . Su principal implementación, el Glasgow Haskell Compiler (GHC), es tanto un intérprete como 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. The Computer Language Benchmarks Game también destaca su implementación de alto rendimiento de concurrencia y paralelismo . [42]
Existe una comunidad activa y en crecimiento en torno al lenguaje, y más de 5.400 bibliotecas y herramientas de código abierto de terceros están disponibles en el repositorio de paquetes en línea Hackage . [43]
Ejemplos de código
Un "¡Hola, mundo!" programa en Haskell (solo la última línea es estrictamente necesaria):
módulo Main ( principal ) donde : no se necesita en el intérprete, es el 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 formas:
- Tipo de anotación (opcional, igual 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 )- Uso de recursividad (con coincidencia de patrones) factorial 0 = 1 factorial n = n * factorial ( n - 1 )- Utilizando recursividad (con guardias) factorial n | n < 2 = 1 | de lo contrario = n * factorial ( n - 1 )- Utilizando una lista y la función "producto" factorial n = producto [ 1 .. n ]- Utilizando fold (implementa "producto") factorial n = foldl ( * ) 1 [ 1 .. n ]- Factorial de estilo sin puntos = foldr ( * ) 1 . enumFromTo 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 sobre listas, donde el primer elemento se toma como pivote:
- Tipo de 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 ( filter ( < x ) xs ) ++ [ x ] ++ quickSort ( filter ( > = x ) xs )
Implementaciones
Todas las implementaciones enumeradas se distribuyen bajo licencias de código abierto . [44]
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). [45] [46] GHC se ha convertido en el dialecto estándar de facto de Haskell. [47] Hay bibliotecas (por ejemplo, enlaces a OpenGL ) que funcionan solo con GHC. GHC también se distribuye con la plataforma Haskell .
- Jhc, un compilador de Haskell escrito por John Meacham, enfatiza la velocidad y eficiencia de los programas generados y explora nuevas transformaciones de programas.
- Ajhc es una bifurcación de Jhc.
- El compilador de Utrecht Haskell (UHC) es una implementación de Haskell de la Universidad de Utrecht . [48] Es compatible con casi todas las funciones de Haskell 98 además de muchas extensiones experimentales. Se implementa utilizando gramáticas de atributos y actualmente se usa 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, [49] pero ahora ha sido reemplazada principalmente por GHCi. También viene con una biblioteca de gráficos.
- HBC es una implementación temprana compatible con Haskell 1.4. Fue implementado por Lennart Augustsson en, y basado en, Lazy ML . No se ha desarrollado activamente durante algún tiempo.
- nhc98 es un compilador de código de bytes que se enfoca 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 el soporte para Hat, el trazador 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:
- Eta y Frege son dialectos de Haskell dirigidos a la máquina virtual Java .
- Gofer era un dialecto educativo de Haskell, con una característica llamada clases de constructores , desarrollada por Mark Jones. Fue reemplazado por Hugs (Haskell User's Gofer System).
- Helio, un dialecto más nuevo de Haskell. El objetivo es facilitar el aprendizaje mediante mensajes de error más claros. Actualmente carece de soporte completo para clases de tipos, lo que lo hace incompatible con muchos programas de Haskell.
Aplicaciones notables
- Cabal es una herramienta para crear y empaquetar bibliotecas y programas de Haskell. [50]
- 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 es a menudo un banco de pruebas para optimizaciones y características de programación funcional avanzadas en otros lenguajes de programación.
- Git-Annex es una herramienta para administrar 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-anexo).
- Linspire GNU / Linux eligió Haskell para el desarrollo de herramientas del sistema. [51]
- Pandoc es una herramienta para convertir un formato de marcado en otro.
- Pugs es un compilador e intérprete del lenguaje de programación Raku (anteriormente Perl 6).
- Xmonad es un administrador de ventanas para el sistema X Window , escrito completamente en Haskell. [52]
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. se implementan 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 anti-spam [53] en Haskell, manteniendo la biblioteca de acceso a datos subyacente como software de código abierto . [54]
- GitHub implementó Semantic , una biblioteca de código abierto para el análisis, la diferenciación y la interpretación de código fuente que no es de confianza, en Haskell. [55]
- seL4 , el primer microkernel verificado formalmente , [56] utilizó Haskell como lenguaje de creación de prototipos para el desarrollador del sistema operativo. [56] : p.2 Al mismo tiempo, el código Haskell definió una especificación ejecutable con la que razonar, para la traducción automática mediante la herramienta de demostración de teoremas. [56] : p.3 El código Haskell sirvió así como un prototipo intermedio antes del refinamiento final de C. [56] : pág.3
Web
Los marcos web notables escritos para Haskell incluyen: [57]
- Quebrar
- Yesod
Crítica
Jan-Willem Maessen, en 2002, y Simon Peyton Jones , en 2003, discutieron los problemas asociados con la evaluación perezosa y al mismo tiempo reconocieron los motivos teóricos de la misma. [58] [59] Además de las consideraciones puramente prácticas como la mejora del rendimiento, [60] señalan que, además de agregar algunos gastos generales de rendimiento, 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 ". [61] Para abordar estos problemas, 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 y, en particular, al eliminar el soporte para clases de tipos .
Ben Lippmeier diseñó Disciple [62] 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 para razonar sobre la evaluación perezosa y en el uso de estructuras de datos tradicionales como mutable matrices. [63] Argumenta (p. 20) que "la actualización destructiva proporciona al programador dos herramientas importantes y poderosas ... un conjunto de estructuras de datos eficientes en forma de matriz para administrar colecciones de objetos, y ... la capacidad de transmitir un 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 usar Haskell para enseñar programación introductoria. Entre estos 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, [64] y la "inferioridad" del (antiguo) sistema de clases de Haskell en comparación con el sistema de módulos de ML. [sesenta y cinco]
La herramienta de compilación de Haskell, Cabal , ha sido históricamente criticada por manejar mal varias versiones de la misma biblioteca, un problema conocido como "infierno Cabal". El servidor Stackage y la herramienta de compilación Stack se crearon en respuesta a estas críticas. [66] Cabal ahora tiene un sistema de construcción mucho más sofisticado, fuertemente inspirado por Nix , [67] 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 es el uso de tipos de singularidad 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, que incluyen:
- Agda , un lenguaje funcional con tipos dependientes .
- Cayenne , con tipos dependientes .
- Elm , un lenguaje funcional para crear aplicaciones web front-end, sin soporte para tipos superiores.
- Epigram , un lenguaje funcional con tipos dependientes adecuado para probar propiedades de programas.
- Idris , un lenguaje funcional de propósito general con tipos dependientes , desarrollado en la Universidad de St Andrews .
- PureScript se compila en JavaScript.
- Ωmega , estricto y más.
Otros idiomas relacionados incluyen:
- Curry , un lenguaje de programación funcional / lógico basado en Haskell.
Las variantes notables de Haskell incluyen:
- Haskell genérico , una versión de Haskell con soporte de sistema de tipos para programación genérica .
- 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 en los buzones de correo, y una descripción de mapeo de salidas a canales como cableado de caja, con un Lenguaje y sintaxis de expresión 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:
- Conferencia Internacional de Programación Funcional (ICFP)
- Simposio Haskell (anteriormente el Taller Haskell)
- Taller de implementadores de Haskell
- Usuarios comerciales de programación funcional (CUFP)
Desde 2006, se ha producido una serie de hackatones organizados , la serie Hac, destinados a mejorar las herramientas y bibliotecas del lenguaje de programación. [68]
Referencias
- ^ a b c Hudak y col. 2007 .
- ↑ a b Marlow, Simon (24 de noviembre de 2009). "Anunciando Haskell 2010" . Haskell (lista de correo) . Consultado el 12 de marzo de 2011 .
- ^ a b Riedel, Herbert (28 de abril de 2016). "ANN: Se ha formado el comité de Haskell Prime 2020" . Haskell-prime (lista de correo) . Consultado el 6 de mayo de 2017 .
- ↑ a b c d e f g h i j k l m Peyton Jones , 2003 , p. xi
- ^ Norell, Ulf (2008). "Programación de tipo dependiente en Agda" (PDF) . Gotemburgo: Universidad de Chalmers . Consultado el 9 de febrero de 2012 .
- ^ Hudak y col. 2007 , págs. 12–38, 43.
- ^ Stroustrup, Bjarne ; Sutton, Andrew (2011). "Diseño de Bibliotecas Conceptuales para C ++" (PDF) . Archivado desde el original (PDF) el 10 de febrero de 2012. Cite journal requiere
|journal=
( ayuda ) - ^ a b c d e f g h i j Hudak et al. 2007 , págs. 12-45–46.
- ^ a b Meijer, Erik (2006). "Confesiones de un vendedor de lenguaje de programación usado: conseguir que las masas se enganchen a Haskell". Oopsla 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 .Mantenimiento de CS1: ubicación ( enlace )
- ^ Hickey, Rich. "Estantería 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). "Levanta la nariz 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). Experto F # . Presione . pag. 2.
F # también se basa en Haskell, particularmente con respecto a dos funciones de lenguaje avanzadas llamadas expresiones de secuencia y flujos de trabajo .
- ^ Wechsung, Ingo. "El lenguaje de programación Frege" (PDF) . Consultado el 26 de febrero de 2014 .
- ^ "Facebook presenta 'Hack', el lenguaje de programación del futuro" . CON CABLE . 20 de marzo de 2014.
- ^ "Idris, un idioma 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 por 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" . Perl Foundation Perl 6 Wiki . La Fundación Perl . Archivado desde el original el 21 de enero de 2012 . Consultado el 9 de febrero de 2012 .
- ^ "The Rust Reference: Apéndice: influencias" . Consultado el 3 de febrero de 2016 .
- ^ Fogus, Michael (6 de agosto de 2010). "MartinOdersky toma (5) toList" . 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 de prueba interna 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 esfuerzo por muchos otros lenguajes en el campo, extrayendo ideas de Objective-C, Rust, Haskell, Ruby, Python, C #, CLU y demasiados otros para enumerarlos.
- ^ "Madera / Historia" . Consultado el 7 de octubre de 2015 .
- ^ 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 .
- ^ Inferencia de tipo originalmente usando la inferencia de tipo Hindley-Milner
- ^ a b c Peyton Jones, 2003 .
- ^ Edward Kmett, Edward Kmett - Clases de tipos 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 del mundo real: código en el que puedes creer . "O'Reilly Media, Inc.". págs. xxviii – xxxi. ISBN 978-0-596-55430-9.
- ^ "Índice de Popularidad de Lenguaje de Programación PYPL" . pypl.github.io . 22 de enero de 2021. Archivado desde el original el 17 de septiembre de 2020 . Consultado el 22 de enero de 2021 .
- ^ Frederickson, Ben. "Ranking de lenguajes de programación por usuarios de GitHub" . www.benfrederickson.com . Consultado el 6 de septiembre de 2019 .
- ^ a b c Peyton Jones 2003 , Prefacio.
- ^ "Clases de tipos, propuestas por primera vez durante el diseño del lenguaje de programación Haskell, ..." - John Garrett Morris (2013), "Clases de tipos y cadenas de instancias: un enfoque relacional"
- ^ Wadler, Philip (octubre de 1988). "Cómo hacer que el polimorfismo ad-hoc sea menos ad hoc" .
- ^ "Wiki de Haskell: Implementaciones" . Consultado el 18 de diciembre de 2012 .
- ^ "Bienvenido a Haskell ' " . Wiki de 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 . ACM : 60–76. doi : 10.1145 / 75277.75283 . ISBN 978-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 comparativas de lenguaje de computadora
- ^ "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 LLVM" . GHC Trac .
- ^ 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). "Migración de HaRe a la API de GHC"
- ^ Compilador de Utrecht Haskell
- ^ Hudak y col. 2007 , págs. 12-22.
- ^ "La Cabal de Haskell" . Consultado el 8 de abril de 2015 .
- ^ "Linspire / Freespire Core OS Team y Haskell" . Lista de correo de Debian Haskell . Mayo de 2006.
- ^ xmonad.org
- ^ "Lucha 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 .
- ^ Analizar, analizar y comparar el código fuente en muchos idiomas: github / semantic , GitHub, 7 de junio de 2019 , consultado el 7 de junio de 2019
- ^ a b c d En 2009 se completó una prueba formal de corrección funcional. Klein, Gerwin; Elphinstone, Kevin; Heiser, Gernot ; Andronick, junio; 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 kernel del sistema operativo" (PDF) . 22º Simposio de ACM sobre principios de sistemas operativos . Big Sky, MT, Estados Unidos.
- ^ "Web / Frameworks - HaskellWiki" . wiki.haskell.org . Consultado el 11 de agosto de 2019 .
- ^ Jan-Willem Maessen. Haskell ansioso: la ejecución limitada por recursos produce una iteración eficiente . Actas deltaller SIGPLANde la Asociación de Maquinaria de Computación (ACM)de 2002en Haskell.
- ^ Simon Peyton Jones. Llevando la camisa de pelo: una retrospectiva de Haskell . Charla invitada en POPL 2003.
- ^ "La evaluación perezosa puede conducir a un rendimiento excelente, como en The Computer Language Benchmarks Game" .
- ^ Heeren, Bastiaan; Leijen, Daan; van IJzendoorn, Arjan (2003). "Helio, para aprender Haskell" (PDF) . Actas del taller ACM SIGPLAN de 2003 sobre Haskell : 62–71. doi : 10.1145 / 871895.871902 . ISBN 1581137583. S2CID 11986908 .
- ^ "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 ,Tesis de doctorado de la Universidad Nacional Australiana (2010), capítulo 1
- ^ Robert Harper. "El punto de la pereza" .
- ^ Robert Harper. "Los módulos son lo más importante" .
- ^ "Resolviendo el Infierno Cabal" . www.yesodweb.com . Consultado el 11 de agosto de 2019 .
- ^ "Anuncio de cabal nueva construcción: construcciones locales de estilo Nix" . Consultado el 1 de octubre de 2019 .
- ^ "Hackathon - HaskellWiki" .
Otras lecturas
- Informes
- Peyton Jones, Simon , ed. (2003). Haskell 98 Lenguaje y bibliotecas: el informe revisado . Prensa de la Universidad de Cambridge. ISBN 978-0521826143.
- Marlow, Simon , ed. (2010). Informe de idiomas de Haskell 2010 (PDF) . Haskell.org.
- Libros de texto
- Davie, Antony (1992). Introducción a los sistemas de programación funcional con Haskell . Prensa de la Universidad de Cambridge. ISBN 978-0-521-25830-2.
- Bird, Richard (1998). Introducción a la programación funcional con Haskell (2ª ed.). Prensa de Prentice Hall. ISBN 978-0-13-484346-9.
- Hudak, Paul (2000). La escuela de expresión Haskell: aprendizaje de la 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 ( texto completo )CS1 maint: posdata ( enlace )
- 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 Haskell para siempre! . San Francisco: No Starch Press. ISBN 978-1-59327-283-8.( texto completo )
- Pájaro, Richard (2014). Pensar funcionalmente con Haskell . Prensa de la Universidad de Cambridge. ISBN 978-1-107-45264-0.
- Tutoriales
- Hudak, Paul; Peterson, John; Fasel, Joseph (junio de 2000). "Una suave introducción a Haskell, versión 98" . Haskell.org .
- Otro tutorial más de Haskell , de Hal Daumé III; asume mucho menos conocimiento previo que el tutorial oficial
- Yorgey, Brent (12 de marzo de 2009). "La Typeclassopedia" (PDF) . The Monad.Reader (13): 17–68.
- Maguire, Sandy (2018). Pensar con tipos: programación de nivel de tipo en Haskell .
- Historia
- Hudak, Paul ; Hughes, John ; Peyton Jones, Simon ; Wadler, Philip (2007). "Una historia de Haskell: ser vago con la clase" (PDF) . Actas de la Tercera Conferencia ACM SIGPLAN sobre Historia de los Lenguajes de Programación (HOPL III) : 12–1–55. doi : 10.1145 / 1238844.1238856 . ISBN 978-1-59593-766-7. S2CID 52847907 .
- Hamilton, Naomi (19 de septiembre de 2008). "La AZ de los lenguajes de programación: Haskell" . Computerworld .
enlaces externos
- Página web oficial
- Wiki oficial