fbpx
Wikipedia

Haskell

Haskell (pronunciado /hæskəl/)[1]​ es un lenguaje de programación estandarizado multi-propósito, funcionalmente puro, con evaluación no estricta y memorizada, y fuerte tipificación estática. Su nombre se debe al lógico estadounidense Haskell Curry, debido a su aportación al cálculo lambda, el cual tiene gran influencia en el lenguaje. En Haskell, "una función es un ciudadano de primera clase" del lenguaje de programación. Como lenguaje de programación funcional, el constructor de controles primario es la función. El lenguaje tiene sus orígenes en las observaciones de Haskell Curry y sus descendientes intelectuales.

Haskell
Paul Hudak, Lennart Augustsson, John Hughes, Simon Peyton Jones, Erik Meijer y Philip Wadler
https://www.haskell.org
Información general
Extensiones comunes hs y lhs
Paradigma Funcional, no estricto, modular, fuertemente tipificado
Apareció en 1990
Diseñado por Universidad de Yale, Universidad de Glasgow
Sistema de tipos Fuerte, estático
Implementaciones GHC, Hugs, NHC, Yhc, JHC
Influido por Miranda, Orwell, ML, Gofer
Ha influido a Python, Java, C#, Scala

En los años 1980 se constituyó un comité cuyo objetivo era crear un lenguaje funcional que reuniera las características de los múltiples lenguajes funcionales de la época, el más notable Miranda, y resolviera la confusión creada por la proliferación de los mismos.

El lenguaje evoluciona rápidamente y (ver más abajo) como los representantes actuales del estándar de facto. El último estándar oficial es: Haskell 2010, cuyas diferencias respecto al anterior estándar Haskell 98 son:

Nuevas características del lenguaje:

  • Interfaz de funciones foráneas (FFI), que permite usar código C en un programa Haskell y código Haskell en un programa C. Un ejemplo explicativo se puede encontrar aquí
  • Nombres jerárquicos para los módulos, por ejemplo Data.Bool.
  • Guardianes con patrones.

Características eliminadas del lenguaje:

  • Sintaxis de patrones (n+k). Con lo cual, la siguiente definición de la función factorial no es válida en Haskell 2010 y posteriores: fact (n+1) = (n+1) * fact n.

Las características más interesantes de Haskell incluyen el soporte para tipos de datos y funciones recursivas, listas, tuplas, guardas y encaje de patrones. La combinación de las mismas pueden resultar en algunas funciones casi triviales cuya versión en lenguajes imperativos pueden llegar a resultar extremadamente tediosas de programar. Haskell es, desde 2002, uno de los lenguajes funcionales sobre los que más se ha investigado. Se han desarrollado muchas variantes:

  • Versiones paralelas del MIT y Glasgow, ambas denominadas Parallel Haskell.
  • Más versiones paralelas y distribuidas de Haskell llamadas Distributed Haskell (anteriormente Goffin) y Eden.
  • Una versión con ejecución especulativa: Eager Haskell.
  • Varias versiones orientadas a objetos: Haskell++, O'Haskell y Mondrian.
  • Una versión educativa llamada Gofer desarrollada por Mark Jones que fue suplantada por Hugs (ver abajo).

Para información más detallada, referirse al sitio oficial o a los enlaces al final de este artículo.

Historia

A partir de la publicación de Miranda, en 1985, los lenguajes funcionales proliferaron. En 1987, existían compitiendo entre ellos más de una docena de lenguajes de programación puros funcionales no estrictos. Durante la conferencia sobre Lenguajes de Programación Funcional y Arquitecturas de Ordenador (FPCA '87) en Portland, Oregón, se mantuvo un encuentro durante el cual se alcanzó un fuerte consenso entre sus participantes para formar un comité que definiese un estándar abierto para tales lenguajes. Esto se hizo con el propósito expreso de consolidar los lenguajes existentes en uno único que sirviera como base para la investigación futura en diseño de lenguajes.[2]​ La primera versión de Haskell ("Haskell 1.0") se definió en 1990.[3]​ Los esfuerzos del comité resultaron en una serie de definiciones del lenguaje, que culminaron a finales de 1997 en Haskell 98, que se intentó fuera una versión del lenguaje mínima, estable y portable, junto con una biblioteca estándar asociada para la enseñanza, y como base de futuras extensiones. El comité expresamente aprobó la creación de extensiones y variantes de Haskell 98 mediante la adición e incorporación de características experimentales.

En enero de 1999, el estándar del lenguaje Haskell 98 se publicó en "The Haskell 98 Report". En enero de 2003, se publicó una versión revisada en "Haskell 98 Language and Libraries: The Revised Report".[4]​ El lenguaje continúa evolucionando rápidamente, con las implementaciones de Hugs y de GHC (véase más adelante), que representan el actual estándar de facto. A principios del 2006 comenzó el proceso de definición de un sucesor del estándar de Haskell 98, llamado informalmente Haskell′ ("Haskell Prime").[5]​ Este proceso intenta producir una revisión menor de Haskell 98.[6]​ En 2010 se lanza Haskell 2010.

Tipos simples predefinidos

En Haskell, y en lo siguiente, "o :: t" quiere decir que la expresión "o" es tiene tipo "t", y "t -> s" es un tipo, específicamente una función, que consume algo de tipo "t" y produce algo de tipo "s". El operador (->) asocia a la derecha, ya que "t -> s -> r" quiere decir "t -> (s -> r)".

El tipo Bool

Los valores con este tipo representan expresiones lógicas cuyo resultado puede ser True o False.

Funciones y operadores

  • (&&) :: Bool -> Bool -> Bool. Conjunción lógica.
  • (||) :: Bool -> Bool -> Bool. Disyunción lógica.
  • not :: Bool -> Bool. Negación lógica.
  • otherwise :: Bool. Función constante que devuelve el valor True.

El tipo Int

Los valores de este tipo son números enteros de precisión limitada que cubren al menos el intervalo [-2^29, 2^29 - 1] ([minBound, maxBound]).

El tipo Integer

Los valores de este tipo son números enteros de precisión ilimitada que tienen las mismas funciones y operadores del tipo Int.

El tipo Float

Los valores de este tipo son números reales. ( 2010, 23.4, 5.7 )

Funciones y operadores

  • (+), (-), (*), (/), (^) :: Float -> Float -> Float. Suma, resta, producto, división real y potencia de exponente entero.
  • abs, signum, negate :: Int -> Int. Valor absoluto, signo y negación.
  • (**) :: Float -> Float. Potencia de exponente real

El tipo Double

Los valores de este tipo son números reales, de mayor rango y con aproximaciones más precisas que los de tipo Float.

El tipo Char

Los valores de este tipo son caracteres que se encuentran en una masa de alta complejidad de en una suma de caracteres dados con su alta definición.

Antes de utilizar esta función en hugs debemos utilizar IMPORT CHAR antes de nuestro algoritmo.

Tuplas

Los elementos que forman una tupla pueden ser del mismo o de distintos tipos. Es un conjunto de componentes relacionados. Por ejemplo: ('a', True,3)

Listas

Los valores de este tipo son una colección de elementos del mismo tipo. Existen dos constructores para listas:

  • [Elementos_separados_por_comas], por ejemplo: [1,2,3,4]
  • (primer_elemento:resto_de_la_lista), por ejemplo: (1:(2:(3:(4:[]))))

Implementaciones

Todas las siguientes implementaciones cumplen en su totalidad, o casi en su totalidad, con los estándares de Haskell 98 y son distribuidas bajo licencias Open Source. No se conocen implementaciones comerciales del lenguaje.

  • Hugs ([1]) es un intérprete. Ofrece una compilación rápida de los programas y un tiempo razonable de ejecución. También viene con una biblioteca gráfica muy simple, lo que lo hace adecuado para quienes lo están aprendiendo. Sin embargo no es una implementación a despreciar, es una de las más livianas y compatibles.
  • GHC ([2]): "Glasgow Haskell Compiler" compila a código nativo en una variedad de arquitecturas y puede también compilar a C. Es, probablemente, uno de los compiladores más populares e incluso tiene unas cuantas bibliotecas (por ejemplo OpenGL) que, aunque muy útiles, sólo funcionan bajo GHC.
  • nhc98 ([3]) es otro compilador con un mejor tiempo de ejecución que Hugs. Esta implementación se enfocó a minimizar la utilización de la memoria convirtiéndola en una buena opción para arquitecturas lentas o antiguas.
  • HBC ([4]) es otro compilador a código nativo de Haskell. Si bien no ha sido actualizado en el último tiempo sigue siendo bastante útil.
  • Helium () es un nuevo dialecto de Haskell. Se centró en ser muy fácil de aprender; por ello, no incluye soporte para todo el estándar de Haskell, haciendo que no sea totalmente compatible.

Entornos de desarrollo

Existen varios IDEs (Integrated Development Environment, o en español, entornos de desarrollo integrado) y/o plugins que se pueden utilizar para desarrollar aplicaciones en Haskell. La mayoría son open source, pero también existen con licencia comercial.

Open Source

  • IntelliJ plugin for Haskell
  • EclipseFP plugin for Eclipse IDE
  • Colorer plugin for Eclipse IDE
  • Leksah
  • KDevelop
  • Vim
  • Emacs
  • Atom

Comerciales

  • Haskell for Mac
  • Sublime-Haskell

Web Frameworks

La comunidad de desarrollo web en Haskell ha tenido recientemente un gran impulso en la actividad, lo que resulta en una gran cantidad de opciones de bibliotecas para utilizar.[7]​ A continuación se presenta la lista de framework activos en Haskell para desarrollo web.

Happstack

Está diseñado para que los desarrolladores puedan prototipar rápidamente, implementar sin dolor, escalar masivamente, operar confiablemente y cambiar fácilmente. Soporta entornos GNU/Linux, macOS, FreeBSD y Windows.

Se considera un framework web completo, el principal componente es happstack-server: un servidor HTTP integrado, combinadores de enrutamiento y fileserving. Además, una serie de paquetes que solían ser acoplados a Happstack ahora han sido desacoplados de él, pero siguen promocionados y documentados para su uso con Happstack:

  • Safecopy: soporte de serialización y migración de tipos de datos
  • Acid-state: un sistema de almacenamiento NoSQL ACID con soporte nativo para tipos Haskell

Snap

Es un framework de desarrollo web basado en una arquitectura snaplet.

Tiene una completa documentación y cuenta con una suite de pruebas con un alto nivel de cobertura de código, pero es un software de etapa inicial con interfaces en constante evolución

Yesod

Está diseñado para aplicaciones web RESTful, de tipo seguro y con alto rendimiento.

Aprovechando la cuasi-cotización para las tareas más fáciles, se provee aplicaciones web concisas con altos niveles de seguridad. Las plantillas de Hamlet se comprueban en tiempo de compilación para ver si son correctas y el controlador utiliza URL seguras para asegurarse de que sólo está generando URL válidas. Sigue los principios del Modelo-Vista-Controlador de forma holgada.

Miku

Una biblioteca sencilla para el rápido prototipado web en Haskell, inspirada en Ruby's Rack y Sinatra.

Lemmachine

Es un RESTful web framework. La arquitectura principal es una copia de Webmachine basada en Erlang, que es actualmente la mejor referencia de documentación. Se destaca por su dinámico Webmachine escrito de forma tipada dependiente en Agda.

Mohws

Es un servidor web con un sistema de módulos y soporte para CGI. Basado en el Servidor Web Haskell original de Simon Marlow.

Salvia

Es un servidor web y un framework de aplicaciones web que puede ser utilizado para escribir sitios web dinámicos en Haskell. Desde el código de protocolo de nivel inferior hasta el código de aplicación de alto nivel, todo está escrito como un controlador de Salvia. Este enfoque hace que el servidor sea extremadamente extensible.

Scotty

Es un framework web inspirado en Sinatra de Ruby, usando WAI y Warp. Es una manera sencilla de escribir aplicaciones web RESTful y declarativas. Tiene buena documentación para todas las funciones relevantes.

Servant

Es un framework ligero principalmente para APIs REST. Permite especificar las especificaciones de una API como alias de tipo y luego trabajar con estos alias de tipo para crear servidores, documentación, código de cliente en Haskell y Javascript. Está basado en WAI.

MFlow

Es un servidor de aplicaciones web. MFlow es una abreviatura de "Flujo de mensajes". Se trata de un framework basado en la continuación, en lugar de otros frameworks basados en la continuación como Ocsigen (Ocaml), Coccoon (javascript) o Seaside (Smalltalk), se basa en una mónada de retroceso que mantiene la sincronización del estado de ejecución con la navegación del usuario. Desde la discontinuación de WASH, MFlow es el único marco de estilo de continuación escrito en Haskell hasta la fecha.

Utiliza las bibliotecas web Haskell estándares y/o técnicas: WAI, Warp, Blaze HTML, HSP. Su núcleo es el servidor y la renderización independiente. Una clase de formlets extendidos se utilizan para crear componentes autónomos, llamados widgets. Tienen formato, AJAX y código de servidor. Se pueden componer para crear la interfaz de usuario.

Spock

Es un framework orientado al rápido desarrollo web: Ofrece todo lo necesario para iniciar rápidamente el hacking web con Haskell: enrutamiento, middleware, json, blaze, sesiones, cookies, ayudante de base de datos, protección csrf, estado global.

Wheb

Es un framework WAI para crear aplicaciones web robustas, de alta concurrencia, simples y efectivas. Su objetivo principal es ampliar la funcionalidad de la base de la biblioteca WAI y proporcionar un punto de entrada fácil en los servidores web de Haskell. Facilita la creación de plugins. Los plugins pueden agregar rutas, middleware, configuraciones e incluso manejar la limpieza de recursos en el apagado del servidor. Las rutas denominadas permiten a los plugins generar dinámicamente sus rutas en tiempo de ejecución basadas en la configuración

WebAPI

WebApi es una biblioteca ligera basada en WAI que permite definir peticiones y respuestas para los puntos finales como tipos a través de un contrato. El contrato se considera la única fuente de verdad, con lo que WebApi permite crear servicios Web / API REST, generar un cliente Haskell para los servicios existentes de la API, generar un servidor simulador para simular las solicitudes y respuestas.

DAML

Es un framework de contrato inteligente basado en el Glasgow Haskell Compiler.

Comunidad

The Haskell Symposium

"The Haskell Symposium" es un simposio anual organizado por la International Conference on Functional Programming (ICFP). El simposio está patrocinado por la Association for Computing Machinery (ACM), bajo los auspicios del ACM Special Interest Group on programming languages (SIGPLAN).

El propósito del evento es discutir la experiencia de los programadores con Haskell, y el futuro desarrollo del lenguaje. El alcance del simposio incluye todos los aspectos del diseño, la semántica, la teoría, la aplicación, la ejecución, y la enseñanza de Haskell.

Antes de 2008, el evento era conocido como "The Haskell Workshop". El cambio de nombre refleja el aumento constante de la influencia del evento en la comunidad en general, así como un creciente número de presentaciones de alta calidad que hacen el proceso de aceptación muy competitivo.

The Summer of Haskell

"The Summer of Haskell" es un evento organizado por haskell.org para llegar a los estudiantes y animarles a contribuir a la comunidad Haskell con la ayuda de mentores experimentados. Este programa está abierto a estudiantes universitarios, mayores de 18 años, en la mayoría de los países.

Ejemplos

Función recursiva para calcular el factorial de un número natural:

 --Función recursiva que calcula el factorial de un número natural factorial :: Integer -> Integer factorial n | n < 0 = error "no existe el factorial para enteros negativos" | n == 0 = 1 | otherwise = n * factorial (n-1) 

Otra versión de la función para calcular el factorial de un natural usando la función product del módulo Data.List:

 --Función para calcular el factorial de un entero usando la función product del módulo Data.List factorial :: Integer -> Integer factorial n | n < 0 = error "no existe el factorial para enteros negativos" | otherwise = product [1..n] 

Función sumatorio de los elementos de una lista de enteros

 --Sumar elementos de una lista sumar :: [Int] -> Int sumar [] = 0 sumar (x:xs) = x+sumar(xs) 

Función para calcular las raíces de una ecuación de segundo grado a partir de sus coeficientes

 --Función para calcular las raíces de una ecuación de segundo grado a partir de sus coeficientes raíces :: Float -> Float -> Float -> (Float, Float) raíces a b c | disc >= 0 = ((-b + raizDisc) / denom,  (-b - raizDisc) / denom) | otherwise = error "La ecuación tiene raíces complejas" where disc = b*b - 4*a*c raizDisc = sqrt disc denom = 2*a 

Función que aproxima el número e

 --Función para calcular el valor de e (2.71828182845905) euler :: Double -> Double euler 0.0 = 1.0 euler n = 1.0 / product [1..n] + euler (n - 1.0) 

Función para calcular el máximo común divisor de dos números enteros mediante el algoritmo de Euclides

 mcd::Int->Int->Int mcd x 0 = x mcd x y = mcd y (mod x y) 

Función que realiza la criba de Eratóstenes (de una lista dada deja solo los números primos)

 eratostenes :: [Int] -> [Int] eratostenes [] = [] eratostenes (x:xs) | not (null xs) && x^2 > last xs = (x:xs)   | otherwise = x: eratostenes [y | y <- xs, y `mod` x /= 0] 

Función que determina si un número natural es palíndromo (en base 10)

isPalindrome :: Int -> Bool isPalindrome n | n < 0 = False | otherwise = let s = show n in s == (reverse s) 

Función que realiza la potencia de un número con recursividad dividiendo el expediente entre 2

potencia :: Double -> Int -> Double potencia b e = if e < 0 then 1 / (potencia b (-e)) else if e == 0 then 1 else let p = potencia b (e `div` 2) in if e `mod` 2 == 1 then p * p * b else p * p 

Función que evalúa de manera perezosa la lista de números primos utilizando una cláusula where y listas intencionales

numerosPrimos::[Integer] numerosPrimos = 2 : [p | p <- [3 ..], es_primo p] where es_primo n | even n = False | otherwise = null [m | m <- [3, 5 .. div n 2], mod n m == 0] 

Implementación del algoritmo Quicksort

qsort :: (Ord a) => [a] -> [a] qsort [] = [] qsort (x:xs) = qsort [y | y <- xs, y <= x] ++ [x] ++ qsort [y | y <- xs, y > x] 

Véase también

Notas y referencias

  1. Chevalier, Tim (28 de enero de 2008), «anybody can tell me the pronuncation of "haskell"?», lista de correo Haskell-cafe, http://www.haskell.org/pipermail/haskell-cafe/2008-January/038756.html, consultado el 12 de marzo de 2011. 
  2. «Preface». Haskell 98 Language and Libraries: The Revised Report. diciembre de 2002. 
  3. . Archivado desde el original el 29 de abril de 2009. 
  4. Simon Peyton Jones (diciembre de 2002). «Haskell 98 Language and Libraries: The Revised Report». 
  5. «Future development of Haskell». 
  6. . The Haskell' Wiki. Archivado desde el original el 23 de abril de 2009. Consultado el 5 de mayo de 2007. 
  7. «Web - HaskellWiki». wiki.haskell.org (en inglés). Consultado el 26 de junio de 2017. 

Bibliografía

  • Ruiz, Blas; Gutiérrez, Francisco; Guerrero, Pablo; y Gallardo, José. Razonando con Haskell. Un curso sobre programación funcional. Thomson.

Enlaces externos

Español:

  • Example of most Haskell features
  • Introducción a Haskell el 5 de abril de 2010 en Wayback Machine.
  • Haskell Básico
  • Una Introducción Agradable a Haskell Versión en español del libro "A Gentle Introduction to Haskell".
  • ¡Aprende Haskell por el bien de todos! Traducción de la obra "Learn you a Haskell for great good".
  • Haskell Básico Curso de Haskell

Inglés:

  • Example of most Haskell features
  • Haskell Página oficial de Haskell
  • Haskell in examples Examples of how to use Haskell
  • Try Haskell Prueba Haskell online
  • A Gentle Introduction to Haskell 98 (pdf format) Una simple introducción a Haskell 98
  • The Evolution of a Haskell Programmer Una forma cómica de ver los distintos estilos de programación en Haskell
  • Bibliografía de investigaciones en Haskell
  • Haskell (programming language)
  • Learn You a Haskell for Great Good

Implementaciones:

  • Hugs Haskell User's Gofer System
  • GHC The Glasgow Haskell Compiler
  • Helium, Helium
  •   Datos: Q34010
  •   Multimedia: Haskell
  •   Libros y manuales: Haskell

haskell, pronunciado, hæskəl, lenguaje, programación, estandarizado, multi, propósito, funcionalmente, puro, evaluación, estricta, memorizada, fuerte, tipificación, estática, nombre, debe, lógico, estadounidense, curry, debido, aportación, cálculo, lambda, cua. Haskell pronunciado haeskel 1 es un lenguaje de programacion estandarizado multi proposito funcionalmente puro con evaluacion no estricta y memorizada y fuerte tipificacion estatica Su nombre se debe al logico estadounidense Haskell Curry debido a su aportacion al calculo lambda el cual tiene gran influencia en el lenguaje En Haskell una funcion es un ciudadano de primera clase del lenguaje de programacion Como lenguaje de programacion funcional el constructor de controles primario es la funcion El lenguaje tiene sus origenes en las observaciones de Haskell Curry y sus descendientes intelectuales HaskellPaul Hudak Lennart Augustsson John Hughes Simon Peyton Jones Erik Meijer y Philip Wadlerhttps www haskell orgInformacion generalExtensiones comuneshs y lhsParadigmaFuncional no estricto modular fuertemente tipificadoAparecio en1990Disenado porUniversidad de Yale Universidad de GlasgowSistema de tiposFuerte estaticoImplementacionesGHC Hugs NHC Yhc JHCInfluido porMiranda Orwell ML GoferHa influido aPython Java C Scala editar datos en Wikidata En los anos 1980 se constituyo un comite cuyo objetivo era crear un lenguaje funcional que reuniera las caracteristicas de los multiples lenguajes funcionales de la epoca el mas notable Miranda y resolviera la confusion creada por la proliferacion de los mismos El lenguaje evoluciona rapidamente y ver mas abajo como los representantes actuales del estandar de facto El ultimo estandar oficial es Haskell 2010 cuyas diferencias respecto al anterior estandar Haskell 98 son Nuevas caracteristicas del lenguaje Interfaz de funciones foraneas FFI que permite usar codigo C en un programa Haskell y codigo Haskell en un programa C Un ejemplo explicativo se puede encontrar aqui Nombres jerarquicos para los modulos por ejemplo Data Bool Guardianes con patrones Caracteristicas eliminadas del lenguaje Sintaxis de patrones n k Con lo cual la siguiente definicion de la funcion factorial no es valida en Haskell 2010 y posteriores fact n 1 n 1 fact n Las caracteristicas mas interesantes de Haskell incluyen el soporte para tipos de datos y funciones recursivas listas tuplas guardas y encaje de patrones La combinacion de las mismas pueden resultar en algunas funciones casi triviales cuya version en lenguajes imperativos pueden llegar a resultar extremadamente tediosas de programar Haskell es desde 2002 uno de los lenguajes funcionales sobre los que mas se ha investigado Se han desarrollado muchas variantes Versiones paralelas del MIT y Glasgow ambas denominadas Parallel Haskell Mas versiones paralelas y distribuidas de Haskell llamadas Distributed Haskell anteriormente Goffin y Eden Una version con ejecucion especulativa Eager Haskell Varias versiones orientadas a objetos Haskell O Haskell y Mondrian Una version educativa llamada Gofer desarrollada por Mark Jones que fue suplantada por Hugs ver abajo Para informacion mas detallada referirse al sitio oficial o a los enlaces al final de este articulo Indice 1 Historia 2 Tipos simples predefinidos 2 1 El tipo Bool 2 1 1 Funciones y operadores 2 2 El tipo Int 2 3 El tipo Integer 2 4 El tipo Float 2 4 1 Funciones y operadores 2 5 El tipo Double 2 6 El tipo Char 2 7 Tuplas 2 8 Listas 3 Implementaciones 4 Entornos de desarrollo 4 1 Open Source 4 2 Comerciales 5 Web Frameworks 5 1 Happstack 5 2 Snap 5 3 Yesod 5 4 Miku 5 5 Lemmachine 5 6 Mohws 5 7 Salvia 5 8 Scotty 5 9 Servant 5 10 MFlow 5 11 Spock 5 12 Wheb 5 13 WebAPI 5 14 DAML 6 Comunidad 6 1 The Haskell Symposium 6 2 The Summer of Haskell 7 Ejemplos 8 Vease tambien 9 Notas y referencias 10 Bibliografia 11 Enlaces externosHistoria EditarA partir de la publicacion de Miranda en 1985 los lenguajes funcionales proliferaron En 1987 existian compitiendo entre ellos mas de una docena de lenguajes de programacion puros funcionales no estrictos Durante la conferencia sobre Lenguajes de Programacion Funcional y Arquitecturas de Ordenador FPCA 87 en Portland Oregon se mantuvo un encuentro durante el cual se alcanzo un fuerte consenso entre sus participantes para formar un comite que definiese un estandar abierto para tales lenguajes Esto se hizo con el proposito expreso de consolidar los lenguajes existentes en uno unico que sirviera como base para la investigacion futura en diseno de lenguajes 2 La primera version de Haskell Haskell 1 0 se definio en 1990 3 Los esfuerzos del comite resultaron en una serie de definiciones del lenguaje que culminaron a finales de 1997 en Haskell 98 que se intento fuera una version del lenguaje minima estable y portable junto con una biblioteca estandar asociada para la ensenanza y como base de futuras extensiones El comite expresamente aprobo la creacion de extensiones y variantes de Haskell 98 mediante la adicion e incorporacion de caracteristicas experimentales En enero de 1999 el estandar del lenguaje Haskell 98 se publico en The Haskell 98 Report En enero de 2003 se publico una version revisada en Haskell 98 Language and Libraries The Revised Report 4 El lenguaje continua evolucionando rapidamente con las implementaciones de Hugs y de GHC vease mas adelante que representan el actual estandar de facto A principios del 2006 comenzo el proceso de definicion de un sucesor del estandar de Haskell 98 llamado informalmente Haskell Haskell Prime 5 Este proceso intenta producir una revision menor de Haskell 98 6 En 2010 se lanza Haskell 2010 Tipos simples predefinidos EditarEn Haskell y en lo siguiente o t quiere decir que la expresion o es tiene tipo t y t gt s es un tipo especificamente una funcion que consume algo de tipo t y produce algo de tipo s El operador gt asocia a la derecha ya que t gt s gt r quiere decir t gt s gt r El tipo Bool Editar Los valores con este tipo representan expresiones logicas cuyo resultado puede ser True o False Funciones y operadores Editar amp amp Bool gt Bool gt Bool Conjuncion logica Bool gt Bool gt Bool Disyuncion logica not Bool gt Bool Negacion logica otherwise Bool Funcion constante que devuelve el valor True El tipo Int Editar Los valores de este tipo son numeros enteros de precision limitada que cubren al menos el intervalo 2 29 2 29 1 minBound maxBound El tipo Integer Editar Los valores de este tipo son numeros enteros de precision ilimitada que tienen las mismas funciones y operadores del tipo Int El tipo Float Editar Los valores de este tipo son numeros reales 2010 23 4 5 7 Funciones y operadores Editar Float gt Float gt Float Suma resta producto division real y potencia de exponente entero abs signum negate Int gt Int Valor absoluto signo y negacion Float gt Float Potencia de exponente realEl tipo Double Editar Los valores de este tipo son numeros reales de mayor rango y con aproximaciones mas precisas que los de tipo Float El tipo Char Editar Los valores de este tipo son caracteres que se encuentran en una masa de alta complejidad de en una suma de caracteres dados con su alta definicion Antes de utilizar esta funcion en hugs debemos utilizar IMPORT CHAR antes de nuestro algoritmo Tuplas Editar Los elementos que forman una tupla pueden ser del mismo o de distintos tipos Es un conjunto de componentes relacionados Por ejemplo a True 3 Listas Editar Los valores de este tipo son una coleccion de elementos del mismo tipo Existen dos constructores para listas Elementos separados por comas por ejemplo 1 2 3 4 primer elemento resto de la lista por ejemplo 1 2 3 4 Implementaciones EditarTodas las siguientes implementaciones cumplen en su totalidad o casi en su totalidad con los estandares de Haskell 98 y son distribuidas bajo licencias Open Source No se conocen implementaciones comerciales del lenguaje Hugs 1 es un interprete Ofrece una compilacion rapida de los programas y un tiempo razonable de ejecucion Tambien viene con una biblioteca grafica muy simple lo que lo hace adecuado para quienes lo estan aprendiendo Sin embargo no es una implementacion a despreciar es una de las mas livianas y compatibles GHC 2 Glasgow Haskell Compiler compila a codigo nativo en una variedad de arquitecturas y puede tambien compilar a C Es probablemente uno de los compiladores mas populares e incluso tiene unas cuantas bibliotecas por ejemplo OpenGL que aunque muy utiles solo funcionan bajo GHC nhc98 3 es otro compilador con un mejor tiempo de ejecucion que Hugs Esta implementacion se enfoco a minimizar la utilizacion de la memoria convirtiendola en una buena opcion para arquitecturas lentas o antiguas HBC 4 es otro compilador a codigo nativo de Haskell Si bien no ha sido actualizado en el ultimo tiempo sigue siendo bastante util Helium 5 es un nuevo dialecto de Haskell Se centro en ser muy facil de aprender por ello no incluye soporte para todo el estandar de Haskell haciendo que no sea totalmente compatible Entornos de desarrollo EditarExisten varios IDEs Integrated Development Environment o en espanol entornos de desarrollo integrado y o plugins que se pueden utilizar para desarrollar aplicaciones en Haskell La mayoria son open source pero tambien existen con licencia comercial Open Source Editar IntelliJ plugin for Haskell EclipseFP plugin for Eclipse IDE Colorer plugin for Eclipse IDE Leksah KDevelop Vim Emacs AtomComerciales Editar Haskell for Mac Sublime HaskellWeb Frameworks EditarLa comunidad de desarrollo web en Haskell ha tenido recientemente un gran impulso en la actividad lo que resulta en una gran cantidad de opciones de bibliotecas para utilizar 7 A continuacion se presenta la lista de framework activos en Haskell para desarrollo web Happstack Editar Esta disenado para que los desarrolladores puedan prototipar rapidamente implementar sin dolor escalar masivamente operar confiablemente y cambiar facilmente Soporta entornos GNU Linux macOS FreeBSD y Windows Se considera un framework web completo el principal componente es happstack server un servidor HTTP integrado combinadores de enrutamiento y fileserving Ademas una serie de paquetes que solian ser acoplados a Happstack ahora han sido desacoplados de el pero siguen promocionados y documentados para su uso con Happstack Safecopy soporte de serializacion y migracion de tipos de datos Acid state un sistema de almacenamiento NoSQL ACID con soporte nativo para tipos HaskellSnap Editar Es un framework de desarrollo web basado en una arquitectura snaplet Tiene una completa documentacion y cuenta con una suite de pruebas con un alto nivel de cobertura de codigo pero es un software de etapa inicial con interfaces en constante evolucion Yesod Editar Esta disenado para aplicaciones web RESTful de tipo seguro y con alto rendimiento Aprovechando la cuasi cotizacion para las tareas mas faciles se provee aplicaciones web concisas con altos niveles de seguridad Las plantillas de Hamlet se comprueban en tiempo de compilacion para ver si son correctas y el controlador utiliza URL seguras para asegurarse de que solo esta generando URL validas Sigue los principios del Modelo Vista Controlador de forma holgada Miku Editar Una biblioteca sencilla para el rapido prototipado web en Haskell inspirada en Ruby s Rack y Sinatra Lemmachine Editar Es un RESTful web framework La arquitectura principal es una copia de Webmachine basada en Erlang que es actualmente la mejor referencia de documentacion Se destaca por su dinamico Webmachine escrito de forma tipada dependiente en Agda Mohws Editar Es un servidor web con un sistema de modulos y soporte para CGI Basado en el Servidor Web Haskell original de Simon Marlow Salvia Editar Es un servidor web y un framework de aplicaciones web que puede ser utilizado para escribir sitios web dinamicos en Haskell Desde el codigo de protocolo de nivel inferior hasta el codigo de aplicacion de alto nivel todo esta escrito como un controlador de Salvia Este enfoque hace que el servidor sea extremadamente extensible Scotty Editar Es un framework web inspirado en Sinatra de Ruby usando WAI y Warp Es una manera sencilla de escribir aplicaciones web RESTful y declarativas Tiene buena documentacion para todas las funciones relevantes Servant Editar Es un framework ligero principalmente para APIs REST Permite especificar las especificaciones de una API como alias de tipo y luego trabajar con estos alias de tipo para crear servidores documentacion codigo de cliente en Haskell y Javascript Esta basado en WAI MFlow Editar Es un servidor de aplicaciones web MFlow es una abreviatura de Flujo de mensajes Se trata de un framework basado en la continuacion en lugar de otros frameworks basados en la continuacion como Ocsigen Ocaml Coccoon javascript o Seaside Smalltalk se basa en una monada de retroceso que mantiene la sincronizacion del estado de ejecucion con la navegacion del usuario Desde la discontinuacion de WASH MFlow es el unico marco de estilo de continuacion escrito en Haskell hasta la fecha Utiliza las bibliotecas web Haskell estandares y o tecnicas WAI Warp Blaze HTML HSP Su nucleo es el servidor y la renderizacion independiente Una clase de formlets extendidos se utilizan para crear componentes autonomos llamados widgets Tienen formato AJAX y codigo de servidor Se pueden componer para crear la interfaz de usuario Spock Editar Es un framework orientado al rapido desarrollo web Ofrece todo lo necesario para iniciar rapidamente el hacking web con Haskell enrutamiento middleware json blaze sesiones cookies ayudante de base de datos proteccion csrf estado global Wheb Editar Es un framework WAI para crear aplicaciones web robustas de alta concurrencia simples y efectivas Su objetivo principal es ampliar la funcionalidad de la base de la biblioteca WAI y proporcionar un punto de entrada facil en los servidores web de Haskell Facilita la creacion de plugins Los plugins pueden agregar rutas middleware configuraciones e incluso manejar la limpieza de recursos en el apagado del servidor Las rutas denominadas permiten a los plugins generar dinamicamente sus rutas en tiempo de ejecucion basadas en la configuracion WebAPI Editar WebApi es una biblioteca ligera basada en WAI que permite definir peticiones y respuestas para los puntos finales como tipos a traves de un contrato El contrato se considera la unica fuente de verdad con lo que WebApi permite crear servicios Web API REST generar un cliente Haskell para los servicios existentes de la API generar un servidor simulador para simular las solicitudes y respuestas DAML Editar Es un framework de contrato inteligente basado en el Glasgow Haskell Compiler Comunidad EditarThe Haskell Symposium Editar The Haskell Symposium es un simposio anual organizado por la International Conference on Functional Programming ICFP El simposio esta patrocinado por la Association for Computing Machinery ACM bajo los auspicios del ACM Special Interest Group on programming languages SIGPLAN El proposito del evento es discutir la experiencia de los programadores con Haskell y el futuro desarrollo del lenguaje El alcance del simposio incluye todos los aspectos del diseno la semantica la teoria la aplicacion la ejecucion y la ensenanza de Haskell Antes de 2008 el evento era conocido como The Haskell Workshop El cambio de nombre refleja el aumento constante de la influencia del evento en la comunidad en general asi como un creciente numero de presentaciones de alta calidad que hacen el proceso de aceptacion muy competitivo The Summer of Haskell Editar The Summer of Haskell es un evento organizado por haskell org para llegar a los estudiantes y animarles a contribuir a la comunidad Haskell con la ayuda de mentores experimentados Este programa esta abierto a estudiantes universitarios mayores de 18 anos en la mayoria de los paises Ejemplos EditarFuncion recursiva para calcular el factorial de un numero natural Funcion recursiva que calcula el factorial de un numero natural factorial Integer gt Integer factorial n n lt 0 error no existe el factorial para enteros negativos n 0 1 otherwise n factorial n 1 Otra version de la funcion para calcular el factorial de un natural usando la funcion product del modulo Data List Funcion para calcular el factorial de un entero usando la funcion product del modulo Data List factorial Integer gt Integer factorial n n lt 0 error no existe el factorial para enteros negativos otherwise product 1 n Funcion sumatorio de los elementos de una lista de enteros Sumar elementos de una lista sumar Int gt Int sumar 0 sumar x xs x sumar xs Funcion para calcular las raices de una ecuacion de segundo grado a partir de sus coeficientes Funcion para calcular las raices de una ecuacion de segundo grado a partir de sus coeficientes raices Float gt Float gt Float gt Float Float raices a b c disc gt 0 b raizDisc denom b raizDisc denom otherwise error La ecuacion tiene raices complejas where disc b b 4 a c raizDisc sqrt disc denom 2 a Funcion que aproxima el numero e Funcion para calcular el valor de e 2 71828182845905 euler Double gt Double euler 0 0 1 0 euler n 1 0 product 1 n euler n 1 0 Funcion para calcular el maximo comun divisor de dos numeros enteros mediante el algoritmo de Euclides mcd Int gt Int gt Int mcd x 0 x mcd x y mcd y mod x y Funcion que realiza la criba de Eratostenes de una lista dada deja solo los numeros primos eratostenes Int gt Int eratostenes eratostenes x xs not null xs amp amp x 2 gt last xs x xs otherwise x eratostenes y y lt xs y mod x 0 Funcion que determina si un numero natural es palindromo en base 10 isPalindrome Int gt Bool isPalindrome n n lt 0 False otherwise let s show n in s reverse s Funcion que realiza la potencia de un numero con recursividad dividiendo el expediente entre 2potencia Double gt Int gt Double potencia b e if e lt 0 then 1 potencia b e else if e 0 then 1 else let p potencia b e div 2 in if e mod 2 1 then p p b else p p Funcion que evalua de manera perezosa la lista de numeros primos utilizando una clausula where y listas intencionales numerosPrimos Integer numerosPrimos 2 p p lt 3 es primo p where es primo n even n False otherwise null m m lt 3 5 div n 2 mod n m 0 Implementacion del algoritmo Quicksort qsort Ord a gt a gt a qsort qsort x xs qsort y y lt xs y lt x x qsort y y lt xs y gt x Vease tambien EditarExample of most Haskell features QuickCheckNotas y referencias Editar Chevalier Tim 28 de enero de 2008 anybody can tell me the pronuncation of haskell lista de correo Haskell cafe http www haskell org pipermail haskell cafe 2008 January 038756 html consultado el 12 de marzo de 2011 Preface Haskell 98 Language and Libraries The Revised Report diciembre de 2002 The History of Haskell Archivado desde el original el 29 de abril de 2009 Simon Peyton Jones diciembre de 2002 Haskell 98 Language and Libraries The Revised Report Future development of Haskell Welcome to Haskell The Haskell Wiki Archivado desde el original el 23 de abril de 2009 Consultado el 5 de mayo de 2007 Web HaskellWiki wiki haskell org en ingles Consultado el 26 de junio de 2017 Bibliografia EditarRuiz Blas Gutierrez Francisco Guerrero Pablo y Gallardo Jose Razonando con Haskell Un curso sobre programacion funcional Thomson Enlaces externos EditarEspanol Example of most Haskell features Introduccion a Haskell Archivado el 5 de abril de 2010 en Wayback Machine Lenguaje de Programacion Funcional Haskell Haskell Basico Una Introduccion Agradable a Haskell Version en espanol del libro A Gentle Introduction to Haskell Aprende Haskell por el bien de todos Traduccion de la obra Learn you a Haskell for great good Haskell Basico Curso de HaskellIngles Example of most Haskell features Haskell Pagina oficial de Haskell Haskell in examples Examples of how to use Haskell Try Haskell Prueba Haskell online A Gentle Introduction to Haskell 98 pdf format Una simple introduccion a Haskell 98 The Evolution of a Haskell Programmer Una forma comica de ver los distintos estilos de programacion en Haskell Online Bibliography of Haskell Research Bibliografia de investigaciones en Haskell Haskell programming language Learn You a Haskell for Great GoodImplementaciones Hugs Haskell User s Gofer System GHC The Glasgow Haskell Compiler Helium Helium Datos Q34010 Multimedia Haskell Libros y manuales HaskellObtenido de https es wikipedia org w index php title Haskell amp oldid 133342917, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos