Haskell

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 6 de noviembre de 2021; las comprobaciones requieren 4 ediciones .
Haskell
clase de idioma funcional , perezoso , modular
tipo de ejecución compilado , interpretado
Apareció en 1990  ( 1990 )
Autor Augustsson, Lennart [d] , Warren Burton [d] , Kevin Hammond [d] , Hudak, Paul [d] ,John Hughes ,Thomas Jonsson ,Peyton-Jones, Simon, John Launchbury [d] .Meyer, Eric , Alastair Reil [d] y Wadler, Philip [d]
Desarrollador Hudak, Paul [d] [1], Augustsson, Lennart [d] [2],John Hughes [3],Peyton-Jones, Simon[4],Meyer, Eric [4]y Wadler, Felipe [d] [4]
extensión de archivo .hso.lhs
Liberar Haskell 2010 (julio de 2010 ) ( 2010-07 )
Versión de prueba Haskell 2020 [5]
sistema de tipos estática fuerte completa con inferencia de tipo
Implementaciones principales GHC , ABRAZOS , NHC , YHC
Dialectos Helio, Gofer , O'Haskell, Haskell++, Mondrian,
Discípulo
sido influenciado ML y Standard ML , Lazy ML , Miranda , Lisp y Scheme , ISWIM , FP ,
APL , Hope and Hope+ , SISAL , Orwell , Id
influenciado Agda , Bluespec , Clojure , C# , Cat , Cayenne , Clean , Curry , Epigram , Escher , F# , Factor , Idris , Isabelle , Java Generics , LINQ , Mercury , Ωmega , Python , Qi , Raku , Rust , Scala , Swift , Timber , Visual Basic 9.0
Sitio web haskell.org
sistema operativo Sistema operativo similar a Microsoft Windows y Unix
 Archivos multimedia en Wikimedia Commons

Haskell ( IPA : [ h æ s k ə l ]) es un lenguaje de programación funcional puro estandarizado de propósito general . Es uno de los lenguajes de programación más comunes con soporte para evaluación perezosa . El sistema de tipos es completo , fuerte , estático , con inferencia automática de tipos , basado en el sistema de tipos Hindley-Milner . Dado que el lenguaje es funcional, la estructura de control principal es una función .

Una característica distintiva del idioma es una actitud seria hacia la mecanografía; en muchos aspectos, en relación con esto, el lenguaje lleva el nombre del investigador de la teoría de tipos e inventor de la lógica combinatoria Haskell Curry .

Hay medios de interacción con el código en otros lenguajes de programación. Hay soporte incorporado para multitarea y programación paralela , herramientas avanzadas (herramientas para pruebas automáticas , depuración y creación de perfiles , incluso para programas paralelos), hay varios miles de bibliotecas de código abierto .

Historia

Haskell pertenece a la familia de lenguajes ML . Fue influenciado directamente por la lengua Miranda , desarrollada en 1985 por David Turner . Miranda fue el primer lenguaje funcional puro en tener soporte comercial y fue relativamente popular en la década de 1980, pero siguió siendo software propietario . Esto dificultó el desarrollo y exploración de las posibilidades de la programación funcional perezosa, por lo que en tan solo un par de años aparecieron más de una decena de lenguajes similares. Para unir los esfuerzos de diferentes desarrolladores en 1987 en la Conferencia sobre Lenguajes de Programación Funcional y Arquitectura de Computadoras en Oregon (FPCA'87), se decidió crear un comité para desarrollar un estándar abierto .

En 1990 se propuso la primera versión del lenguaje, Haskell 1.0. Posteriormente, el trabajo del comité continuó, y en 1999 se publicó The Haskell 98 Report [6] , que se convirtió en un estándar lingüístico estable durante muchos años. Sin embargo, el lenguaje continuó evolucionando rápidamente, siendo el compilador GHC el estándar de facto para las nuevas funciones.

El desarrollo de nuevas versiones del lenguaje está abierto, este proceso se llama Haskell' [7] (Haskell Prime [ˈhæskəl praɪm], "Haskell stroke"). Todos pueden presentar sus propuestas para el debate, las propuestas se debaten a lo largo del año, el comité selecciona y anuncia las propuestas que está listo para aceptar, se forma un nuevo comité y se prepara una nueva versión del lenguaje para finales del año. Por lo tanto, ahora pueden aparecer nuevas versiones del lenguaje cada año. Está previsto declarar algunas revisiones como "principales" y mantener dichas revisiones durante mucho tiempo.

Haskell 2010 se anunció a finales de 2009 [8] , pero Haskell 98 sigue siendo la última versión "significativa" (estándar).

Características de la lengua

Las principales características del lenguaje Haskell son las siguientes:

Ha pasado mucho tiempo desde la adopción del último estándar de lenguaje (Haskell98), y desde entonces las principales implementaciones del lenguaje (ghc y hugs) se han ampliado con muchas características adicionales:

Implementaciones de lenguaje

Hay varias implementaciones del lenguaje Haskell [10] . Algunas implementaciones se centran en aplicaciones prácticas, mientras que otras son principalmente de interés académico.

Compiladores e intérpretes

El más popular [11] en la práctica es el compilador de optimización GHC , que crea código rápido y permite el uso de muchas extensiones de lenguaje. GHC puede optimizar tanto la velocidad como la compacidad de los programas, y es capaz de crear código paralelizado y multitarea. El compilador GHC también viene con el entorno de programación interactivo GHCi con un depurador integrado. GHC se ejecuta en Windows, MacOS X y varias plataformas similares a Unix (Linux, *BSD, Solaris). Es GHC el compilador estándar en la Plataforma Haskell, y es en él que todas las bibliotecas nuevas se prueban en primer lugar [12] .

Otra implementación de lenguaje popular es el intérprete HUGS . Está escrito en C , tiene un tamaño de distribución pequeño y funciona en casi todas las plataformas. HUGS proporciona un entorno de programación interactivo , pero también puede ejecutar programas de Haskell al estilo de los lenguajes de secuencias de comandos . Los usuarios de Windows pueden utilizar el entorno gráfico interactivo de WinHugs. Debido a que HUGS es un intérprete, los programas que se ejecutan en él funcionan más lentamente que el código producido por la mayoría de los compiladores de Haskell. HUGS a menudo se recomienda como un medio para el aprendizaje de idiomas. HUGS es totalmente compatible con el estándar de idioma Haskell 98, así como con algunas de las extensiones de idioma más populares.

Otras implementaciones notables [13] :

Plataforma Haskell

En 2009, se formó el concepto de Haskell Platform [14]  : un kit de distribución de lenguaje estándar que incluye, además del compilador (GHC), también herramientas adicionales (el sistema de implementación y creación de paquetes Cabal) y un conjunto de bibliotecas populares. .

Haskell Platform es ahora la distribución base recomendada para desarrolladores. Las compilaciones listas de Haskell Platform están disponibles para Windows, MacOS X y varias distribuciones de Linux.

Plataformas de destino alternativas

La mayoría de los compiladores de Haskell producen código nativo para la plataforma subyacente, pero existen varios proyectos que le permiten producir código para máquinas virtuales o generar código en otros lenguajes de programación. El grado de madurez y el nivel de apoyo para tales proyectos varía mucho.

Varias plataformas de destino interesantes están disponibles cuando se usa el compilador YHC, como el intérprete de código de bytes YHC en Python y el código de bytes YHC para el convertidor Erlang Core, pero estos desarrollos aún son experimentales. También hay implementaciones de subconjuntos del idioma en diferentes plataformas de destino.

Extensiones de idioma

Extensiones de implementación de idioma (se aplica a GHC):

Ejemplos

Cálculo factorial

El siguiente ejemplo muestra la sintaxis del lenguaje Haskell al implementar una función para calcular el factorial :

fac :: Entero -> Entero fac 0 = 1 fac n | n > 0 = n * factor ( n - 1 )

Esta definición describe el proceso de cálculo factorial como una función recursiva . Esta definición es similar a la que se encuentra en los libros de texto de informática . La mayoría del código fuente de Haskell es similar a la notación matemática en términos de sintaxis y uso, por ejemplo, el ejemplo anterior se puede reescribir como

fac n = producto [ 1 .. n ]

que corresponde a la definición matemática de factorial.

La primera línea del código anterior es opcional y es una declaración de tipo de función , es decir, especifica los tipos de argumento (especificados antes del último " ->") y el tipo de retorno (especificado después del último " ->"). Esta línea se puede leer como: la función factiene tipo ( ::) de entero a entero ( Integer -> Integer) . Esto significa que toma un argumento entero como entrada (escrito a la izquierda de "->") y devuelve un resultado de tipo entero (escrito a la derecha de "->"). Si el programador no ha especificado los tipos explícitamente, el compilador o intérprete puede determinarlos automáticamente.

Las líneas segunda y tercera forman la definición del cuerpo de la función. La definición consta de oraciones, o "cláusula" ( cláusula inglesa  ). Cada oración es un par patrón-expresión. El compilador o intérprete utiliza el mecanismo de coincidencia de patrones para seleccionar una de las expresiones. En este caso, la segunda línea de la definición se seleccionará cuando el parámetro real de la llamada a la función sea cero. fac

En la tercera línea, además del mecanismo de coincidencia de patrones, se usa una expresión de guardia - n > 0. Garantiza que la función no funcionará para números negativos, para los cuales el factorial no está definido. Si se pasa un número negativo como parámetro real a la función fac, el programa se detendrá con un mensaje de error.

Calculadora

La calculadora más simple para evaluar expresiones en notación polaca inversa se puede definir en Haskell con una sola función:

calc :: Cadena -> Flotante calc = cabeza . doblar f [] . palabras donde f :: [ Flotante ] -> Cadena -> [ Flotante ] f ( x : y : zs ) "+" = ( y + x ) : zs f ( x : y : zs ) "-" = ( y - x ) : zs f ( x : y : zs ) "*" = ( y * x ) : zs f ( x : y : zs ) "/" = ( y / x ) : zs f ( x : y : zs ) "VOLTEO" = y : x : zs f ( x : zs ) "ABS" = ( abs x ) : zs f xs y = leer y : xs

La cadena de entrada con la expresión de entrada aquí se divide mediante la función estándar wordsen una lista de palabras (cadenas entre caracteres de espacio en blanco) que se procesa mediante la función de plegado a la izquierda ( foldl) de izquierda a derecha, una palabra a la vez mediante la función f, que mantiene una lista de trabajo de números leídos y valores intermedios (al principio [] , una lista vacía) e interpreta cada palabra de entrada como un símbolo para una función aritmética o como un número, ya que evalúa el valor final de la expresión ( que será el primer valor restante en la lista de trabajo cuando finalice la lista de palabras de la expresión de entrada, para que pueda recuperarse desde allí utilizando la función estándar head).

Aquí (.)está el operador de composición de función, (f . g) x = f (g x). Por ejemplo,

* Principal > calc "1 2 3 + 4 * - ABS" 19.0

Números de Fibonacci

Otro ejemplo muestra una forma de calcular una lista infinita de números de Fibonacci en tiempo lineal:

mentiras = 0 : 1 : zipWith ( + ) mentiras ( mentiras en la cola )

La lista infinita aquí se define utilizando el mecanismo de correcursión  : los valores posteriores de la lista se establecen en función de los anteriores, con el inicial 0y 1como los dos primeros elementos de la lista, y una expresión generadora zipWith (+) fibs (tail fibs) que calcula todos los elementos . a partir de la tercera en base a las dos anteriores, a través de una función estándar zipWith (+)que suma por pares elementos de dos de sus listas de entrada.

Esta definición es un ejemplo de evaluación perezosa , que es una parte esencial del lenguaje Haskell. Para comprender cómo funciona esta definición, puede considerar calcular los primeros siete números de Fibonacci usándola:

mentiras = 0 : 1 : 1 : 2 : 3 : 5 : 8 : ... + + + + + + mentiras en la cola = 1 : 1 : 2 : 3 : 5 : 8 : ... ====== zipCon (+) = 1 : 2 : 3 : 5 : 8 : ... mentiras = 0 : 1 : 1 : 2 : 3 : 5 : 8 : ...

Lo mismo se puede escribir también cuando se usan especificadores de lista ,

mentiras = 0 : 1 : [ un + segundo | ( a , b ) <- mentiras zip ( mentiras de la cola )]

o una extensión del lenguaje Haskell implementado en el compilador GHC ( comprensiones de listas paralelas ) : 

mentiras = 0 : 1 : [ un + segundo | a <- mentiras | b <- mentiras en la cola ]

o con una función generadora directamente autorreferencial :

fibs = 0 : 1 : siguiente fibs donde siguiente ( a : t @ ( b : _ )) = ( a + b ) : siguiente t

Números primos

Estos ejemplos muestran cómo se pueden usar las expresiones de lista ( listas por comprensión ). La implementación de encontrar todos los números primos de la manera habitual ( comprobando cada número para ver si es primo ):

-- definición general (todos los números naturales > 1 que son primos) primoNums = 2 : [ n | n <- [ 3 .. ], esPrimo n ] -- Un número es primo si no tiene divisores (primos) isPrime n = foldr ( \ p r -> p * p > n || ( rem n p /= 0 && r )) True primeNums

o con el tamiz de Eratóstenes , en una variante prototípica, ineficiente,

números primos = ( cabeza del mapa . scanl menos [ 2 .. ] . mapa ( \ p -> [ p , p + p .. ])) números primos

o eficientemente, con los flujos de números compuestos previamente en cascada:

primos = 2 : _Y (( 3 : ) . minus [ 5 , 7 .. ] . unionAll . map ( \ p -> [ p * p , p * p + 2 * p .. ])) donde _Y g = g ( _Y g ) unionAll (( x : xs ) : t ) = x : unión xs ( unionAll ( pares t )) pares (( x : xs ) : ys : t ) = ( x : unión xs ys ) : pares t

o segmento por segmento, por arreglos,

importar Data.Array importar Data.List ( tails , inits ) pd = 2 : [ norte | ( r : q : _ , px ) <- ( zip . tails . ( 2 : ) . map ( ^ 2 )) ps ( inits ps ), ( n , True ) <- assocs ( accumArray ( \ _ _ -> False ) Verdadero ( r + 1 , q - 1 ) [( m , () ) | p <- px , sea s = div ( r + p ) p * p , m <- [ s , s + p .. q - 1 ]] )]

usando funciones canónicas minus, union[27] ):

unión ( x : xs ) ( y : ys ) = caso comparar x y de LT -> x : unión xs ( y : ys ) EQ -> x : unión xs ys GT -> y : unión ( x : xs ) ys unión a b = a ++ b menos ( x : xs ) ( y : ys ) = comparación de casos x y de LT -> x : menos xs ( y : ys ) EQ -> menos xs ys GT -> menos ( x : xs ) ys menos a b = a

Descripción de los naipes

Un ejemplo simple del uso de tipos de datos algebraicos para describir naipes. Los identificadores de tipo comienzan con letras mayúsculas. Identificadores de variables y funciones - en minúsculas. Los nuevos tipos algebraicos se definen con la palabra clave data. Los sinónimos de tipo se definen mediante la palabra clave type.

-- Traje algebraico de suma de tipos ("enumeración"). -- Un valor del tipo Palo puede ser uno de los enumerados a la derecha (o Picas, Tréboles, Diamantes o Corazones). -- "Palo" aquí actúa como constructor de _tipo_, -- y "Picas", "Tréboles", etc. - Constructores de _datos_. datos Palo = Picas | Clubes | panderetas | Corazones : inferencia automática opcional de instancias de clase , que le permite convertir valores en cadenas (usando la función mostrar de Mostrar) y viceversa (usando la función de lectura de Leer), así como compararlos entre sí. -- (por funciones de las clases Eq y Ord). derivación ( Mostrar , Leer , Eq , Ord ) -- Tipo de suma algebraica Datos de valor Valor = Siete | Ocho | Nueve | Diez | gato | dama | Rey | Derivación de as ( Mostrar , Leer , Eq , Ord ) -- Mapa algebraico tipo-producto ("tipo-tupla"). -- Los valores de tipo Card son combinaciones de valores de tipo Value y Suit, -- unidos por el constructor de datos K. -- A menudo, los nombres del constructor de datos y el constructor de tipo son los mismos. Tarjeta de datos = K Valor Traje derivado ( Mostrar , Leer , Eq , Ord ) -- Un sinónimo de una lista de valores de tipo Map. tipo Mano = [ Carta ] -- Una función que determina si hay matrimonio (rey y reina del mismo palo) en la mano. isMarriage :: Hand -> Bool isMarriage of the card = -- simplemente encuentre el matrimonio de al menos un palo cualquiera ( isMarriageSuits ) [ Picas , Tréboles , Diamantes , Corazones ] donde -- compruebe si hay una reina y un rey de el palo dado m en la mano es Trajes de boda m = ( K Reina m ) cartas ` elem` && ( K Rey m ) cartas ` elem` _ _ -- ejemplos de manos mano = [ K Reina de Tréboles , K Siete de Corazones , K Rey de Tréboles , K As de Diamantes ] mano_sin_matrimonio = [ K Diez de Picas , K Rey de Picas , K Reina de Corazones ] main = do check hand check hand_without_marriage check [] -- distribución vacía donde check kk = putStrLn ( ( show kk ) ++ " -> " ++ ( show ( is Margage kk )) ) -- Conclusión: -- [A la Reina de Tréboles, Al Siete de Corazones, Al Rey de Tréboles, Al As de Diamantes] -> Cierto -- [Al Diez de Picas, Al Rey de Picas, A la Reina de Corazones] -> Falso -- [] -> Falso

Integración numérica

Integración numérica por el método trapezoidal:

trapecioIntegrar f a b n = (( sum $ map f [ a + h , a + 2 * h .. b - h ]) + t ) * h where t = ( f a + f b ) / 2 h = ( b -a ) / n_ _ main = imprimir $ trapezeIntegrate ( \ x - > x * sin x ) 0 ( 2 * pi ) 100 -- Salida: -6.281118086046067

Comprobación de palíndromos

El siguiente ejemplo demuestra cómo trabajar con cadenas Unicode .

importar Data.Char ( toLower , isAlpha ) palindrom :: [ Char ] -> Bool palindrom s = norma == norma inversa donde norma = map toLower $ filter isAlpha $ s prueba :: [ Char ] -> IO () prueba s = putStrLn $ s ++ ": " ++ mostrar ( palíndromo s ) main = hacer test "Y azul en el Yenisei" test "Cayó una rosa en la pata de Azor" test "Ni una rosa cayó en la pata de Azor" test "El mundo es como Roma" test "El mundo no es Roma" test "Prefiero Pi" prueba "حوت فمه مفتوح" prueba "Ne mateno, bone tamen" -- Conclusión: -- Y en el Yenisei — azul: Cierto -- Cayó una rosa en la pata de Azor: Cierto -- Ni una rosa cayó en la pata de Azor: Falso -- El mundo es como Roma: Cierto -- El mundo no es Rome: Falso -- Prefiero Pi: ​​Verdadero -- حوت فمه مفتوح: Verdadero -- Ne mateno, bone tamen: Verdadero

Aplicaciones escritas en Haskell

Aplicaciones Comerciales

Haskell es cada vez más[ float ] utilizado en entornos comerciales [28] . Esto se ve facilitado por la tradición adoptada en la comunidad de liberar bibliotecas bajo licencias liberales (más del 70% de las bibliotecas disponibles gratuitamente se distribuyen bajo los términos de licencias BSD, MIT o son de dominio público).

Estos son algunos ejemplos de aplicaciones comerciales escritas en Haskell: Bluespec SystemVerilog, un lenguaje de verificación y diseño de semiconductores integrable, es una extensión del lenguaje Haskell [29] . Cryptol, un lenguaje comercial para desarrollar y verificar algoritmos criptográficos, se implementa en Haskell. En particular, el primer micronúcleo seL4 verificado formalmente también se escribió en Haskell.

Haskell se utiliza activamente en el campo de la programación financiera, el análisis de riesgos y los sistemas de apoyo a la toma de decisiones . Haskell es utilizado por los desarrolladores del generador de paisajes urbanos para juegos y simulaciones Gamr7 [30] . Hay ejemplos de aplicación exitosa del lenguaje para el desarrollo de sistemas de información privada en organizaciones comerciales (incluidas las de los países de la CEI) [31] . En el DBMS analítico SQreamDB , el módulo analizador de SQL está escrito en Haskell.

Aplicaciones de código abierto

Una parte significativa de las bibliotecas y aplicaciones de código abierto escritas en Haskell están disponibles en el archivo de Hackage. Entre ellos se encuentran el convertidor de marcado universal Pandoc , el editor de texto similar a Yi emacs y el entorno de desarrollo integrado Leksah . Entre los desarrollos del sistema se encuentran el sistema de control de versiones distribuidas Darcs , el sistema operativo House y el administrador de ventanas en mosaico Xmonad .

El compilador GHC a menudo sirve como campo de pruebas para probar nuevas funciones de optimización y programación funcional. Al mismo tiempo, los compiladores de lenguaje Agda , Curry , Epigram , así como el primer compilador e intérprete del lenguaje Perl 6 Pugs (fue creado en solo un mes) fueron escritos en Haskell .

Notas

  1. 1 2 http://news.yale.edu/2015/04/30/memoriam-paul-hudak-computer-scientist-and-saybrook-college-master
  2. 1 2 http://softwareengineeringdaily.com/2015/11/05/haskell-with-lennart-augustsson/
  3. 1 2 http://www.cse.chalmers.se/~rjmh/Software/h++.html
  4. 1 2 3 4 5 6 Una historia de Haskell: ser perezoso con la clase - SIGPLAN , 2007.
  5. Se formó el comité Haskell Prime 2020 . Archivado desde el original el 11 de junio de 2016. Consultado el 1 de abril de 2022.
  6. The Haskell 98 Language Report Archivado el 8 de marzo de 2010 en Wayback Machine  - consultado el 05/02/2010
  7. Haskell Prime (enlace descendente) . Fecha de acceso: 5 de febrero de 2010. Archivado desde el original el 19 de diciembre de 2008. 
  8. Simon Marlow, Anunciando Haskell 2010 . Fecha de acceso: 26 de diciembre de 2009. Archivado desde el original el 13 de febrero de 2015.
  9. La interfaz de funciones externas de Haskell 98 1.0: una adición al informe de Haskell 98 . Consultado el 16 de octubre de 2004. Archivado desde el original el 10 de octubre de 2004.
  10. Implementaciones del lenguaje Haskell . Consultado el 24 de febrero de 2010. Archivado desde el original el 17 de marzo de 2010.
  11. Resultados de la encuesta del estado de Haskell de 2017  , taylor.fausak.me . Archivado desde el original el 8 de noviembre de 2018. Consultado el 12 de noviembre de 2018.
  12. El compilador Haskell de Glasgow. La arquitectura de las aplicaciones de código abierto, volumen 2 Archivado el 30 de mayo de 2017 en Wayback Machine , 2012 
  13. Una historia de Haskell: ser perezoso con la clase - SIGPLAN, 2007 . Consultado el 9 de septiembre de 2017. Archivado desde el original el 9 de septiembre de 2017.
  14. La Plataforma Haskell . Consultado el 24 de febrero de 2010. Archivado desde el original el 27 de febrero de 2010.
  15. Solicitud de fusión: Generador de código LLVM para GHC (enlace descendente) . Consultado el 24 de febrero de 2010. Archivado desde el original el 23 de febrero de 2010. 
  16. El compilador Haskell de Glasgow y LLVM . Consultado el 7 de agosto de 2011. Archivado desde el original el 25 de junio de 2011.
  17. Fumar código Haskell rápido usando el nuevo código LLVM de GHC . Consultado el 24 de febrero de 2010. Archivado desde el original el 25 de febrero de 2010.
  18. LambdaVM (enlace descendente) . Consultado el 24 de febrero de 2010. Archivado desde el original el 15 de febrero de 2010. 
  19. JVM-Bridge (enlace descendente) . Consultado el 24 de febrero de 2010. Archivado desde el original el 8 de mayo de 2010. 
  20. La página de inicio del Proyecto Jaskell (enlace descendente) . Consultado el 24 de febrero de 2010. Archivado desde el original el 26 de enero de 2009. 
  21. Ejecutar Haskell en CLR (usando UHC) . Consultado el 24 de febrero de 2010. Archivado desde el original el 9 de agosto de 2021.
  22. 1.5.1 ¿Por qué GHC no está disponible para .NET o en JVM? . Consultado el 24 de febrero de 2010. Archivado desde el original el 29 de marzo de 2010.
  23. Generador de código JavaScript para GHC (enlace descendente) . Consultado el 24 de febrero de 2010. Archivado desde el original el 13 de marzo de 2010. 
  24. Yhc/Javascript, YCR2JS, un convertidor de Yhc Core a Javascript . Consultado el 24 de febrero de 2010. Archivado desde el original el 3 de junio de 2010.
  25. Inicio faylang/fay Wiki GitHub . Consultado el 25 de junio de 2013. Archivado desde el original el 24 de junio de 2013.
  26. CλaSH: de Haskell al hardware . Consultado el 16 de junio de 2018. Archivado desde el original el 15 de junio de 2018.
  27. Funciones del módulo Data.List.Ordered . Archivado el 1 de octubre de 2011 en Wayback Machine .
  28. Aplicaciones comerciales de Haskell Archivado el 8 de abril de 2017 en Wayback Machine . 
  29. Bluespec . Consultado el 6 de febrero de 2010. Archivado desde el original el 6 de febrero de 2010.
  30. Gamr7: UrbanPAD. El software para la creación de ciudades y edificios en 3D. . Consultado el 18 de febrero de 2010. Archivado desde el original el 16 de febrero de 2010.
  31. Dmitri Astapov. Uso de Haskell para respaldar un sistema de información crítico para el negocio  // Práctica de programación funcional: Diario. - 2009. - Nº 2 . - S. 53-69 . Archivado desde el original el 13 de febrero de 2010.

Literatura

  • Bryan O'Sullivan, John Goerzen, Don Stewart . Real World Haskell - O'Reilly, 2008 - 710°C. ISBN 0-596-51498-0 . ISBN 978-0-596-51498-3
  • Dushkin Román Viktorovich Programación funcional en Haskell / Cap. edición D. A. Movchan;. — M. : DMK Press, 2008. — 544 p., il. Con. - 1500 copias.  — ISBN 5-94074-335-8 .
  • Graham Hutton . "Programación en Haskell". Prensa de la Universidad de Cambridge. ISBN 978-0-521-87172-3 . ISBN 978-0-521-69269-4
  • Kees Doets, Jan van Eijck . "El camino de Haskell a la lógica, las matemáticas y la programación". ISBN 0-9543006-9-6 .

Enlaces

  • haskell.org  - el sitio principal dedicado al lenguaje Haskell; contiene varios materiales de referencia, una lista de intérpretes y compiladores de Haskell (por el momento, todos los intérpretes y compiladores son gratuitos). Además, hay una extensa lista de enlaces a recursos sobre teoría de la programación funcional y otros lenguajes ( Standard ML , Clean ).
Material de formación y referencia