Haskell ( / ˈ h æ s k əl / [ 25 ] ) es un lenguaje de programación funcional puro , de propósito general y con tipado estático , con inferencia de tipos y evaluación perezosa . [ 26 ] [ 27 ] Haskell fue pionero en varias características de lenguajes de programación, incluyendo clases de tipos para sobrecarga de operadores con seguridad de tipos y entrada/salida (E/S) monádica . Recibe su nombre del lógico Haskell Curry . [ 1 ] La implementación principal de Haskell es el Glasgow Haskell Compiler (GHC).
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. [ 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 ] A mayo de 2021 Haskell fue el 28.º lenguaje de programación más popular según las búsquedas de tutoriales en Google , [ 32 ] y representó menos del 1 % de los usuarios activos en el repositorio de código fuente de GitHub . [ 33 ]
Historia
Tras el lanzamiento de Miranda por Research Software Ltd. en 1985, creció el interés por los lenguajes funcionales perezosos. Para 1987, existían más de una docena de lenguajes de programación puramente funcionales no estrictos . Miranda era el más utilizado, pero era software propietario . En la conferencia sobre Lenguajes de Programación Funcionales y Arquitectura de Computadoras (FPCA '87) en Portland, Oregón , hubo un fuerte consenso sobre la necesidad de formar 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. [ 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 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 (E/S) se manejaban mediante mecanismos basados en flujos y en continuaciones , que se consideraban ampliamente insatisfactorios. [ 36 ] En la versión 1.3, se introdujo la E/S monádica , junto con la generalización de las clases de tipos a tipos superiores ( constructores de tipos ). Junto con la notación "do", que proporciona azúcar sintáctico para la Monadclase de tipo, esto le dio a Haskell un sistema de efectos que mantenía la transparencia referencial y era conveniente.
Otro cambio notable en las primeras versiones fue el traslado de la operación de " evaluación secuencialseq " (que crea una dependencia de datos entre valores y se utiliza en lenguajes perezosos para evitar un consumo excesivo de memoria) de una clase de tipo a una función estándar para facilitar la refactorización.
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 y 1.4).

Foldabley Traversable(con los cambios correspondientes en las firmas de tipo de algunas funciones), y de Applicativecomo intermedio entre Functory Monad, son desviaciones del estándar Haskell 2010.Haskell 98
A finales de 1997, la serie culminó con Haskell 98 , concebido para especificar una versión estable, mínima y portátil del lenguaje, junto con una biblioteca estándar para la enseñanza y como base para futuras extensiones. El comité acogió con beneplácito 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, denominado informalmente Haskell Prime . [ 38 ] Se pretendía que fuera un proceso incremental continuo para revisar la definición del lenguaje, con 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 añadió varias características muy utilizadas y poco controvertidas que anteriormente se habilitaban mediante indicadores específicos del compilador.
- Nombres de módulos jerárquicos. Los nombres de los módulos pueden consistir en secuencias de identificadores en mayúsculas separados por puntos, en lugar de un solo identificador. Esto permite nombrar los módulos de forma jerárquica (por ejemplo,
Data.Listen lugar deList), aunque técnicamente los módulos siguen estando en un único espacio de nombres monolítico. Esta extensión se especificó en un apéndice de Haskell 98 y, en la práctica, se utilizó universalmente. - La interfaz de funciones externas (FFI) permite la vinculación con otros lenguajes de programación. En el informe solo se especifican las vinculaciones con C , pero el diseño permite la vinculación con otros lenguajes. Para ello, se permitió que las declaraciones de tipos de datos no contuvieran constructores, lo que posibilitó tipos nonce robustos para datos externos que no podían construirse en Haskell. Esta extensión ya se había especificado en un apéndice del Informe Haskell 98 y se utilizaba ampliamente.
- Los denominados patrones n + k (definiciones de la forma
fact (n+1) = (n+1) * fact n) ya no estaban permitidos. Este azúcar sintáctico tenía una semántica engañosa, en la que el código parecía usar el(+)operador, pero de hecho se desazucara para usar(-)y(>=). - Se flexibilizaron las reglas de inferencia de tipos para permitir que más programas realizaran la comprobación de tipos.
- Se corrigieron algunos problemas de sintaxis (cambios en la gramática formal): se agregaron guardas de patrones , lo que permite la coincidencia de patrones dentro de las guardas; la resolución de la fijeza de operadores se especificó de una manera más simple que reflejaba la práctica real; se abordó un caso límite en la interacción de la sintaxis léxica del lenguaje de operadores y comentarios, y se ajustó la interacción de la notación do y if-then-else para eliminar errores de sintaxis inesperados.
- Se especificó la
LANGUAGEdirectiva pragma . Para 2010, docenas de extensiones del lenguaje se utilizaban ampliamente, y GHC (entre otros compiladores) proporcionó laLANGUAGEdirectiva pragma para especificar extensiones individuales con una lista de identificadores. Los compiladores de Haskell 2010 deben admitir laHaskell2010extensión y se les recomienda admitir varias otras, que corresponden a extensiones añadidas en Haskell 2010.
Estándares futuros
La siguiente especificación formal estaba prevista para 2020. [ 3 ] El 29 de octubre de 2021, con la versión 9.2.1 de GHC, se publicó la extensión GHC2021. Si bien no se trata de una especificación formal del lenguaje, combina varias extensiones de GHC estables y ampliamente utilizadas para Haskell 2010. [ 39 ] [ 40 ]
Características
Haskell incluye evaluación perezosa , 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 específica para representar los efectos secundarios, independiente del tipo de función. Una función pura puede devolver un efecto secundario que se ejecuta posteriormente, modelando las funciones impuras de otros lenguajes.
Haskell posee un sistema de tipos estático y robusto basado en la inferencia de tipos de Hindley-Milner . Su principal innovación en este ámbito son las clases de tipos, concebidas originalmente como una forma sistemática de añadir sobrecarga al lenguaje, [ 41 ] pero que desde entonces han encontrado muchos más usos. [ 42 ]
La estructura 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 una sintaxis simplificada para su uso.
Haskell cuenta con una especificación abierta y publicada [ 27 ] , y existen múltiples implementaciones . Su implementación principal, 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 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 resalta 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 ( main ) donde -- no es necesario en el intérprete, es el valor predeterminado en un archivo de módulomain :: IO () -- el compilador puede inferir esta definición de tipo main = putStrLn "¡Hola, mundo!"La función factorial en Haskell, definida de varias maneras diferentes (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 condiciones) factorial n | n < 2 = 1 | en otro caso = 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 1El uso del combinador de punto fijo de Haskell permite escribir esta función sin ninguna recursión explícita.
import Data.Function ( fix )factorial = fijar fac donde fac f x | x < 2 = 1 | en otro caso = 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.
Implementación de un algoritmo similar al de ordenación rápida 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 ]-- Usando comprensiones de listas 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 ] -- Ordenar 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 ]
Entre las implementaciones que cumplen total o casi totalmente con el estándar Haskell 98 se incluyen:
- El compilador Glasgow Haskell (GHC) compila a código nativo en muchas arquitecturas de procesador diferentes, y a ANSI C , a través de uno de dos lenguajes intermedios : C-- , o en versiones más recientes, bitcode LLVM (anteriormente Low Level Virtual Machine). [ 46 ] [ 47 ] GHC se ha convertido en el dialecto Haskell estándar de facto . [ 48 ] Hay bibliotecas (por ejemplo, enlaces a OpenGL ) que funcionan solo con GHC. GHC también se distribuyó con la plataforma Haskell . GHC presenta un entorno de ejecución asíncrono que también programa hilos en múltiples núcleos de CPU similar al entorno de ejecución de Go .
- Jhc, un compilador de Haskell escrito por John Meacham, hace hincapié en la velocidad y la eficiencia de los programas generados, así como en la exploración de nuevas transformaciones de programas.
- Ajhc es una bifurcación de Jhc.
- El compilador Haskell de Utrecht (UHC) es una implementación de Haskell de la Universidad de Utrecht . [ 49 ] Admite casi todas las características de Haskell 98, además de numerosas extensiones experimentales. Está implementado mediante gramáticas de atributos y se utiliza principalmente para la investigación de sistemas de tipos generados y extensiones del lenguaje.
Las implementaciones que ya no reciben mantenimiento activo incluyen:
- El sistema Gofer para usuarios de Haskell ( Hugs ) es un intérprete de código de bytes . En su momento fue una de las implementaciones más utilizadas, junto con el compilador GHC, [ 50 ] pero ahora ha sido reemplazado en gran medida por GHCi. También incluye una biblioteca gráfica.
- HBC es una implementación temprana compatible con Haskell 1.4. Fue implementada por Lennart Augustsson en Lazy ML y se basa en él . No se ha desarrollado activamente desde hace algún tiempo.
- nhc98 es un compilador de código de bytes que se centra en minimizar el uso de memoria.
- El compilador York Haskell ( Yhc ) era una bifurcación de nhc98, con el objetivo de ser más simple, más portátil y más eficiente, e integrar soporte para Hat, el rastreador de Haskell. También tenía un backend de JavaScript , lo que permitía a los usuarios ejecutar programas Haskell en navegadores web .
Las implementaciones que no cumplen totalmente con Haskell 98 y que utilizan una variante del lenguaje Haskell incluyen:
- Eta y Frege son dialectos de Haskell que tienen como objetivo la máquina virtual de Java .
- Gofer es un dialecto didáctico de Haskell, con una característica llamada clases constructoras , desarrollado por Mark Jones. Ha sido reemplazado por el sistema Gofer de usuarios de Haskell (Hugs).
- Helium, un dialecto más reciente de Haskell. Su objetivo es facilitar el aprendizaje mediante mensajes de error más claros, desactivando las clases de tipos por defecto.
Aplicaciones destacadas
- Agda es un asistente de pruebas 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 versiones escrito en Haskell, con varias características innovadoras, como un control más preciso de los parches que se deben aplicar.
- Glasgow Haskell Compiler (GHC) también se utiliza con frecuencia como banco de pruebas para características avanzadas de programación funcional y optimizaciones en otros lenguajes de programación.
- Git-annex es una herramienta para gestionar archivos de datos (grandes) bajo el control de versiones de Git . También proporciona un sistema de sincronización de archivos distribuido (git-annex assistant).
- Linspire Linux eligió Haskell para el desarrollo de herramientas del sistema. [ 53 ]
- Pandoc es una herramienta para convertir un formato de marcado en otro.
- Pugs es un compilador e intérprete para el lenguaje de programación que entonces se llamaba Perl 6, pero que desde entonces ha sido renombrado como Raku .
- TidalCycles es un lenguaje de dominio especial para la codificación en vivo de patrones musicales, integrado en Haskell. [ 54 ]
- Xmonad es un gestor de ventanas para el sistema X Window , escrito completamente en Haskell. [ 55 ]
- GarganText [ 56 ] es una herramienta colaborativa para mapear textos de análisis semántico en cualquier navegador web , escrita completamente en Haskell y PureScript , que se utiliza, por ejemplo, en la comunidad de investigación para elaborar informes y hojas de ruta de vanguardia. [ 57 ]
Industria
- Bluespec SystemVerilog (BSV) es una extensión del lenguaje Haskell para el diseño de electrónica . Es un ejemplo de lenguaje específico de dominio integrado en Haskell. Además, las herramientas de Bluespec, Inc. están implementadas en Haskell.
- Cryptol , un lenguaje y un conjunto de herramientas para desarrollar y verificar algoritmos criptográficos , está implementado en Haskell.
- Facebook implementa sus programas anti-spam [ 58 ] en Haskell, manteniendo la biblioteca de acceso a datos subyacente como software de código abierto . [ 59 ]
- La plataforma blockchain Cardano está implementada en Haskell. [ 60 ]
- GitHub implementó Semantic, una biblioteca de código abierto para analizar, comparar e interpretar código fuente no confiable para muchos lenguajes, en Haskell. [ 61 ]
- El lenguaje de modelado financiero Mu de Standard Chartered es Haskell sintáctico que se ejecuta en un entorno de ejecución estricto. [ 62 ]
- seL4 , el primer microkernel formalmente verificado , [ 63 ] utilizó Haskell como lenguaje de prototipado para el desarrollador del sistema operativo. [ 64 ] : p.2 Al mismo tiempo, el código Haskell definió una especificación ejecutable con la que razonar, para su traducción automática por la herramienta de demostración de teoremas. [ 63 ] : p.3 El código Haskell sirvió así como prototipo intermedio antes del refinamiento final en C. [ 63 ] : p.3
- El software de optimización de la cadena de suministro de las tiendas Target está escrito en Haskell. [ 65 ]
- Coprotagonista [ 66 ]
- El backend de Mercury Technologies está escrito en Haskell. [ 67 ]
- Anduril Industries utiliza Haskell para su familia de sistemas de guerra electrónica Pulsar.
Web
Entre los marcos web notables escritos para Haskell se incluyen: [ 68 ]
Crítica
Jan-Willem Maessen, en 2002, y Simon Peyton Jones , en 2003, analizaron los problemas asociados con la evaluación perezosa, reconociendo también los motivos teóricos para la misma. [ 69 ] [ 70 ] Además de consideraciones puramente prácticas como la mejora del rendimiento, [ 71 ] señalan que la evaluación perezosa dificulta que los programadores razonen sobre el rendimiento de su código (en particular, su uso de espacio).
Bastiaan Heeren, Daan Leijen y Arjan van IJzendoorn también observaron en 2003 algunos obstáculos para los aprendices de Haskell: «La sutil sintaxis y el sofisticado sistema de tipos de Haskell son un arma de doble filo: muy apreciados 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». [ 72 ] 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, desactiva las clases de tipos por defecto. [ 73 ]
Ben Lippmeier diseñó Disciple [ 74 ] como un dialecto de Haskell estricto por defecto (perezoso por anotación explícita) con un sistema de tipos y efectos, para abordar las dificultades de Haskell en el razonamiento sobre la evaluación perezosa y en el uso de estructuras de datos tradicionales como los arreglos mutables. [ 75 ] Argumenta (p. 20) que "la actualización destructiva proporciona al programador dos herramientas importantes y poderosas... un conjunto de estructuras de datos eficientes similares a arreglos para gestionar colecciones de objetos, y... la capacidad de difundir 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 expuesto sus razones para no utilizar Haskell en la enseñanza de la programación introductoria. Entre ellas se encuentran la dificultad de razonar sobre el uso de recursos con evaluación no estricta, que la evaluación perezosa complica la definición de tipos de datos y el razonamiento inductivo, [ 76 ] y la "inferioridad" del sistema de clases (antiguo) de Haskell en comparación con el sistema de módulos de ML. [ 77 ]
La herramienta de compilación de Haskell, Cabal , ha sido criticada históricamente por su deficiente manejo de múltiples versiones de una 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. [ 78 ] Desde entonces, Cabal ha abordado este problema tomando prestadas ideas del gestor de paquetes Nix , [ 79 ] y este nuevo enfoque se convirtió en el predeterminado en 2019.
Idiomas relacionados
Clean es un pariente cercano, aunque algo más antiguo, de Haskell. Su mayor diferencia con Haskell radica en el uso de tipos de unicidad en lugar de mónadas para la entrada/salida (E/S) y los efectos secundarios.
Se han desarrollado una serie de lenguajes inspirados en Haskell, pero con diferentes sistemas de tipos, entre los que se incluyen:
- Agda , un lenguaje funcional con tipos dependientes .
- Cayenne , con tipos dependientes.
- Elm , un lenguaje funcional para crear aplicaciones web front-end, no admite clases o instancias de tipos definidos por el usuario o de orden superior .
- Epigram , un lenguaje funcional con tipos dependientes adecuado para demostrar propiedades de programas.
- Idris , un lenguaje funcional de propósito general con tipos dependientes, desarrollado en la Universidad de St Andrews .
- PureScript se transpila a JavaScript.
- Ωmega , un lenguaje estricto que permite la introducción de nuevos tipos y la programación a nivel de tipos.
Otros idiomas relacionados incluyen:
- Curry , un lenguaje de programación funcional/lógica basado en Haskell.
Entre las variantes más destacadas de Haskell se incluyen:
- Haskell genérico , una versión de Haskell con soporte para 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 a los buzones, y una descripción de mapeo de salidas a canales como cableado de cajas, con un lenguaje de expresiones y una sintaxis similares a Haskell.
Conferencias y talleres
Los eventos de Haskell se han celebrado regularmente de forma concurrente con la Conferencia Internacional sobre Programación Funcional (ICFP), incluyendo talleres como el Simposio de Haskell (anteriormente Taller de Haskell) y Usuarios Comerciales de Programación Funcional. [ 80 ] Otros eventos incluyen el Taller de Implementadores de Haskell, [ 81 ] ZuriHac en Zúrich , [ 82 ] y Hac: El Hackathon de Haskell. [ 83 ]
Véase también
Referencias
- 1 2 3 Hudak et al. 2007 .
- 1 2 Marlow, Simon (24 de noviembre de 2009). "Anuncio de Haskell 2010" . Haskell (Lista de correo) . Recuperado el 12 de marzo de 2011 .
- 1 2 Riedel, Herbert (28 de abril de 2016). "ANN: Se ha formado el comité de Haskell Prime 2020" . Haskell-prime (Lista de correo) . Recuperado el 6 de mayo de 2017 .
- 1 2 3 4 5 6 7 8 9 10 11 12 13 Peyton Jones 2003 , pág. xi
- ↑ Norell, Ulf (2008). "Programación con tipos dependientes en Agda" (PDF) . Gotemburgo: Universidad Chalmers . Consultado el 9 de febrero de 2012 .
- ↑ Hudak et al. 2007 , págs. 12–38, 43.
- ↑ Stroustrup, Bjarne ; Sutton, Andrew (2011). "Diseño de bibliotecas de conceptos para C++" (PDF) . Ingeniería de lenguajes de software . Archivado del original (PDF) el 10 de febrero de 2012.
- 1 2 3 4 5 6 7 8 9 10 Hudak et al. 2007 , pp. 12-45–46.
- 1 2 Meijer, Erik (2006). "Confesiones de un vendedor de lenguajes de programación usados: cómo enganchar a las masas a Haskell". Oopsla 2007. CiteSeerX 10.1.1.72.868 .
- ↑ Meijer, Erik (1 de octubre de 2009). "C9 Lectures: Dr. Erik Meijer – Functional Programming Fundamentals, Chapter 1 of 13" . Channel 9. Microsoft. Archivado del original el 16 de junio de 2012. Recuperado el 9 de febrero de 2012 .
- ↑ Drobi, Sadek (4 de marzo de 2009). "Erik Meijer sobre LINQ" . InfoQ . QCon SF 2008: C4Media Inc. Recuperado el 9 de febrero de 2012 .
{{cite news}}: CS1 mantenimiento: ubicación ( enlace ) - ↑ Hickey, Rich. "Clojure Bookshelf" . Listmania! . Archivado del original el 3 de octubre de 2017. Recuperado el 3 de octubre de 2017 .
- ↑ Heller, Martin (18 de octubre de 2011). "Desprecia a Dart y descubre CoffeeScript" . InfoWorld . Consultado el 15 de julio de 2020 .
- ↑ "Programación declarativa en Escher" (PDF) . Consultado el 7 de octubre de 2015 .
- ↑ Syme, Don ; Granicz, Adam; Cisternino, Antonio (2007). Expert F# . Apress . p. 2.
F# también se 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" . WIRED . 20 de marzo de 2014.
- ↑ "Idris, un lenguaje de tipado dependiente" . Consultado el 26 de octubre de 2014 .
- ↑ "Inspiración para LiveScript" . Consultado el 4 de febrero de 2014 .
- ↑ Freeman, Phil (2016). "PureScript by Example" . Leanpub . Recuperado el 23 de abril de 2017 .
- ↑ Kuchling, AM "Functional Programming HOWTO" . Documentación de Python v2.7.2 . Python Software Foundation . Consultado el 9 de febrero de 2012 .
- ↑ "Glosario de términos y jerga" . Fundación Perl Perl 6 Wiki . La Fundación Perl . Archivado del original el 21 de enero de 2012. Consultado el 9 de febrero de 2012 .
- ↑ "Influencias - The Rust Reference" . The Rust Reference . Consultado el 31 de diciembre de 2023 .
- ↑ Fogus, Michael (6 de agosto de 2010). "MartinOdersky toma(5) aList" . Send More Paramedics . Recuperado el 9 de febrero de 2012 .
- ↑ Lattner, Chris (3 de junio de 2014). "Página web de Chris Lattner" . Chris Lattner . Recuperado 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 increíblemente importante que proporcionó retroalimentación 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, tomando ideas de Objective-C, Rust, Haskell, Ruby, Python, C#, CLU y demasiados otros para enumerar.
- ↑ 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 tipos utilizando originalmente la inferencia de tipos de Hindley-Milner
- 1 2 3 Peyton Jones 2003 .
- ↑ Edward Kmett, Edward Kmett – Clases de tipos frente al mundo
- ↑ Mossberg, Erik (8 de junio de 2020), erkmos/haskell-companies , consultado el 22 de junio de 2020
- ↑ O'Sullivan, Bryan; Goerzen, John; Stewart, Donald Bruce (15 de noviembre de 2008). Real World Haskell: Code You Can Believe In . O'Reilly Media, Inc. págs. xxviii– xxxi. ISBN 978-0-596-55430-9.
- ↑ "Haskell en producción: Riskbook" . Serokell Software Development Company . Consultado el 7 de septiembre de 2021 .
- ↑ "Índice de popularidad de lenguajes de programación de PYPL" . pypl.github.io . Mayo de 2021. Archivado del 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 .
- 1 2 3 Peyton Jones 2003 , Prefacio.
- ↑ Wadler, Philip (octubre de 1988). "Cómo hacer que el polimorfismo ad hoc sea menos ad hoc" .
- ↑ Peyton Jones, Simon (2003). "Llevando la camisa de cilicio: una retrospectiva sobre Haskell" . Microsoft .
- ↑ "Haskell Wiki: Implementaciones" . Consultado el 18 de diciembre de 2012 .
- ↑ "Bienvenido a Haskell"" . La wiki de Haskell . Archivado del original el 20 de febrero de 2016 . Consultado el 11 de febrero de 2016 .
- ↑ Equipo de GHC 2020 (29 de octubre de 2021)Lanzamiento de GHC 9.2.1
- ↑ Propuesta de cambios en el compilador y el lenguaje para GHC y GHC/Haskell
- ↑ Wadler, P.; Blott, S. (1989). «Cómo hacer que el polimorfismo ad hoc sea menos ad hoc». Actas del 16.º simposio ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación - POPL '89 . ACM . págs. 60–76 . doi : 10.1145/75277.75283 . ISBN 978-0-89791-294-5. 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 de CS/CE . Varberg, Suecia.
- ↑ "Juego de evaluación comparativa de lenguajes informáticos" . Archivado del original el 17 de enero de 2021. Consultado el 12 de febrero de 2021 .
- ↑ "Estadísticas de HackageDB" . Hackage.haskell.org. Archivado del original el 3 de mayo de 2013. Consultado el 26 de junio de 2013 .
- ↑ "Implementaciones" en la Wiki de Haskell
- ↑ "El backend de LLVM" . GHC Trac . 29 de marzo de 2019. Archivado del original el 7 de abril de 2017. Consultado el 31 de marzo de 2016 .
- ↑ Terei, David A.; Chakravarty, Manuel MT (2010). "Un backend LLVM para GHC" . Actas del Simposio ACM SIGPLAN Haskell 2010. ACM Press.
- ↑ C. Ryder y S. Thompson (2005). "Adaptación de HaRe a la API de GHC"
- ↑ Compilador Haskell de Utrecht
- ↑ Hudak et al. 2007 , págs. 12–22.
- ^ Agda 2 , Comunidad Agda Github, 15 de octubre de 2021 , consultado el 16 de octubre de 2021
- ↑ "La cábala de Haskell" . Consultado el 8 de abril de 2015 .
- ↑ "Equipo principal del sistema operativo Linspire/Freespire y Haskell" . Lista de correo de Debian Haskell . Mayo de 2006. Archivado del original el 27 de diciembre de 2017. Consultado el 14 de junio de 2006 .
- ↑ "Código en vivo con Tidal Cycles" . Tidal Cycles . Archivado del original el 12 de septiembre de 2024. Consultado el 19 de enero de 2022 .
- ↑ xmonad.org
- ↑ "Gargantext – Principal" . 13 de julio de 2023.
- ↑ David, Chavalarias; et al. (8 de mayo de 2023). Hacia una agenda de investigación sobre medios digitales y bienestar de la humanidad (informe).
- ↑ "Combatir el spam con Haskell" . Código de Facebook . 26 de junio de 2015. Consultado el 11 de agosto de 2019 .
- ↑ "Liberación de código abierto de Haxl, una biblioteca para Haskell" . Facebook Code . 10 de junio de 2014. Consultado el 11 de agosto de 2019 .
- ↑ "input-output-hk/cardano-node: El componente principal que se utiliza para participar en una cadena de bloques descentralizada de Cardano" . GitHub . Consultado el 18 de marzo de 2022 .
- ↑ Stocks, Nathan (CleanCut) (7 de junio de 2019). "Análisis, comparación y análisis de código fuente en varios lenguajes" . GitHub/semantic . Consultado el 19 de julio de 2025 .
- ↑ "Informe del taller para usuarios comerciales de programación funcional" (PDF) . Consultado el 10 de junio de 2022 .
- 1 2 3 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 sistema operativo" (PDF) . 22.º Simposio ACM sobre Principios de Sistemas Operativos . Big Sky, Montana, EE. UU.
- ↑Error de cita: La referencia con nombre
klein-sosp=09fue invocada pero nunca definida (consulte la página de ayuda ). - ↑ "Tikhon Jelvis: Haskell en Target" . YouTube . 22 de abril de 2017.
- ↑ "Por qué Co-Star usa Haskell" . Co-Star . Consultado el 30 de septiembre de 2023 .
- ↑ "Haskell en producción: Mercury" . Serokell . Consultado el 11 de octubre de 2024 .
- ↑ "Web/Frameworks – HaskellWiki" . wiki.haskell.org . Consultado el 17 de septiembre de 2022 .
- ↑ Jan-Willem Maessen. Eager Haskell: La ejecución con recursos limitados produce una iteración eficiente . Actas del taller SIGPLAN de la Association for Computing Machinery (ACM) de 2002 sobre Haskell.
- ↑ Simon Peyton Jones. Llevando puesto el cilicio: una retrospectiva sobre Haskell . Charla invitada en POPL 2003.
- ↑ "La evaluación perezosa puede conducir a un rendimiento excelente, como en el juego de evaluación comparativa de lenguajes de programación" . 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 . ISBN 1581137583. S2CID 11986908 .
- ↑ "Documentación del compilador Helium" . GitHub . Consultado el 9 de junio de 2023 .
- ↑ "DDC – HaskellWiki" . Haskell.org. 3 de diciembre de 2010. Consultado el 26 de junio de 2013 .
- ↑ Ben Lippmeier, Inferencia de tipos y optimización para un mundo impuro ,Tesis doctoral de la Universidad Nacional Australiana (2010), capítulo 1
- ↑ Robert Harper (25 de abril de 2011). "El sentido de la pereza" .

- ↑ Robert Harper (16 de abril de 2011). "Los módulos son lo más importante" .

- ↑ "Resolviendo el infierno de la cábala" . www.yesodweb.com . Consultado el 11 de agosto de 2019 .
- ↑ "Anuncio de nueva compilación de cabal: compilaciones locales al estilo Nix" . Consultado el 1 de octubre de 2019 .
- ↑ "El Simposio Haskell" . www.haskell.org . Consultado el 1 de noviembre de 2025 .
- ↑ "Taller de implementadores de Haskell 2025" . haskell.foundation . Consultado el 1 de noviembre de 2025 .
- ↑ "Amigos de Haskell de Zúrich" . zfoh.ch. Consultado el 13 de marzo de 2025 .
- ↑ "Hackathon – HaskellWiki" .
Bibliografía
- Informes
- Peyton Jones, Simon , ed. (2003). Haskell 98 Language and Libraries: The Revised Report . Cambridge University Press. ISBN 978-0521826143.
- Marlow, Simon , ed. (2010). Informe del lenguaje Haskell 2010 (PDF) . Haskell.org.
- Libros de texto
- Davie, Antony (1992). Introducción a los sistemas de programación funcional con Haskell . Cambridge University Press. ISBN 978-0-521-25830-2.
- Bird, Richard (1998). Introducción a la programación funcional con Haskell (2.ª ed.). Prentice Hall Press. ISBN 978-0-13-484346-9.
- Hudak, Paul (2000). La escuela de expresión de Haskell: Aprendizaje de programación funcional a través de multimedia . Nueva York: Cambridge University Press. ISBN 978-0521643382.
- Hutton, Graham (2007). Programación en Haskell . Cambridge University Press. ISBN 978-0521692694.
- O'Sullivan, Bryan; Stewart, Don; Goerzen, John (2008). Real World Haskell . Sebastopol: O'Reilly. ISBN 978-0-596-51498-3.Haskell del mundo real (texto completo).
- Thompson, Simon (2011). Haskell: El arte de la programación funcional (3.ª ed.). Addison-Wesley. ISBN 978-0201882957.
- Lipovača, Miran (abril de 2011). ¡Aprende Haskell para un gran bien! San Francisco: No Starch Press. ISBN 978-1-59327-283-8.( texto completo )
- Bird, Richard (2014). Pensamiento funcional con Haskell . Cambridge University Press. ISBN 978-1-107-45264-0.
- Bird, Richard ; Gibbons, Jeremy (julio de 2020). Diseño de algoritmos con Haskell . Cambridge University Press. ISBN 978-1-108-49161-7.
- Tutoriales
- Hudak, Paul ; Peterson, John; Fasel, Joseph (junio de 2000). "Una introducción sencilla a Haskell, versión 98" . Haskell.org .
- ¡Aprende Haskell para un bien mayor! - Una versión comunitaria ( learnyouahaskell.github.io ) . Una versión actualizada y mantenida por la comunidad de la reconocida guía "Learn You a Haskell" (LYAH).
- Daumé, Hal III. Otro tutorial más de Haskell (PDF) .Presupone muchos menos conocimientos previos que el tutorial oficial.
- Yorgey, Brent (12 de marzo de 2009). "The Typeclassopedia" (PDF) . The Monad.Reader (13): 17–68 .
- Maguire, Sandy (2018). Pensando con tipos: Programación a nivel de tipos en Haskell .
- Historia
- Hudak, Paul ; Hughes, John ; Peyton Jones, Simon ; Wadler, Philip (2007). «Una historia de Haskell» (PDF) . Actas de la tercera conferencia ACM SIGPLAN sobre la historia de los lenguajes de programación . págs. 12-1-55. doi : 10.1145/1238844.1238856 . ISBN 978-1-59593-766-7. S2CID 52847907 .
- Hamilton, Naomi (19 de septiembre de 2008). "El AZ de los lenguajes de programación: Haskell" . Computerworld .
Enlaces externos
- Lenguajes de programación académica
- Lenguajes de programación compilados
- Lenguajes de programación educativa
- Lenguajes funcionales
- Familia de lenguajes de programación Haskell
- Programación alfabetizada
- Lenguajes de programación que coinciden con patrones
- Lenguajes de programación creados en 1990
- Lenguajes de programación de tipado estático