1. Haskell
Haskell (pronunciado /hæskəl/)[1]
es un lenguaje de
programación estandarizado multi-propósito puramente
funcional con semánticas no estrictas y fuerte tipifica-
ción estática. Su nombre se debe al lógico estadouniden-
se Haskell Curry. En Haskell, “una función es un ciu-
dadano de primera clase” del lenguaje de programación.
Como lenguaje de programación funcional, el construc-
tor de controles primario es la función. El lenguaje tiene
sus orígenes en las observaciones de Haskell Curry y sus
descendientes intelectuales.
En los años 1980 se constituyó un comité cuyo objetivo
era crear un lenguaje funcional que reuniera las caracte-
rí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) co-
mo los representantes actuales del estándar de facto. El
último estándar semi-oficial es Haskell 2010, cuyas dife-
rencias 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 Has-
kell 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 siguien-
te 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, lis-
tas, tuplas, guardas y encaje de patrones. La combinación
de las mismas pueden resultar en algunas funciones ca-
si 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 de-
nominadas Parallel Haskell.
• Más versiones paralelas y distribuidas de Haskell lla-
madas Distributed Haskell (anteriormente Goffin) y
Eden
• Una versión con ejecución especulativa: Eager Has-
kell
• 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.
1 Historia
A partir de la publicación de Miranda, en 1985, los len-
guajes funcionales proliferaron. En 1987, existían com-
pitiendo 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 al-
canzó un fuerte consenso entre sus participantes para for-
mar un comité que definiese un estándar abierto para ta-
les lenguajes. Esto se hizo con el propósito expreso de
consolidar los lenguajes existentes en uno único que sir-
viera 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é re-
sultaron en una serie de definiciones del lenguaje, que cul-
minaron a finales de 1997 en Haskell 98, que se intentó
fuera una versión del lenguaje mínima, estable y porta-
ble, 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 varian-
tes 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 Langua-
ge and Libraries: The Revised Report”.[4]
El lenguaje
continúa evolucionando rápidamente, con las implemen-
taciones 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
1
2. 2 4 IMPLEMENTACIONES
del estándar de Haskell 98, llamado informalmente Has-
kell′ (“Haskell Prime”).[5]
Este proceso intenta producir
una revisión menor de Haskell 98.[6]
En 2010 se lanza
Haskell 2010.
2 Introducción a Haskell
3 Tipos simples predefinidos
3.1 El tipo Bool
Los valores con este tipo representan expresiones lógicas
cuyo resultado puede ser True o False.
3.1.1 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.
3.2 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]).
3.3 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.
3.4 El tipo Float
Los valores de este tipo son números reales. ( 2010, 23.4,
5.7 )
3.4.1 Funciones y operadores
• (+), (-), (*), (/), (^) :: Float -> Float -> Float. Suma,
resta, producto, división real y potencia de exponen-
te entero.
• abs, signum, negate :: Int -> Int. Valor absoluto,
signo y negación.
• (**) :: Float -> Float. Potencia de exponente real
3.5 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.
3.6 El tipo Char
Los valores de este tipo son caracteres que se encuentran
en una masa de alta complejidad de en una suma de ca-
racteres dados con su alta definición
Antes de utilizar esta función en hugs debemos utilizar
IMPORT CHAR antes de nuestro algoritmo
3.7 Tuplas
Los elementos que forman una tupla pueden ser del mis-
mo o de distintos tipos. Es un conjunto de componentes
relacionados. Por ejemplo: ('a', True,3)
3.8 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:[]))))
4 Implementaciones
Todas las siguientes implementaciones cumplen en su to-
talidad, o casi en su totalidad, con los estándares de Has-
kell 98 y son distribuidas bajo licencias Open Source. No
se conocen implementaciones comerciales del lenguaje.
• Hugs () 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 librería gráfica
muy simple, lo que lo hace adecuado para quienes
lo están aprendiendo. Sin embargo no es una imple-
mentación a despreciar, es una de las más livianas y
compatibles.
• GHC (): “Glasgow Haskell Compiler” compila a có-
digo nativo en una variedad de arquitecturas y pue-
de también compilar a C. Es, probablemente, uno
de los compiladores más populares e incluso tiene
unas cuantas librerías (por ejemplo OpenGL) que,
aunque muy útiles, sólo funcionan bajo GHC.
• nhc98 () es otro compilador con un mejor tiempo de
ejecución que Hugs. Esta implementación se enfocó
3. 6.2 The Summer of Haskell 3
a minimizar la utilización de la memoria convirtién-
dola en una buena opción para arquitecturas lentas
o antiguas.
• HBC () es otro compilador a código nativo de Has-
kell. Si bien no ha sido actualizado en el último tiem-
po 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.
5 Entornos de desarrollo
Existen varios IDEs (Integrated Development Environ-
ment, o en español, entornos de desarrollo integrado) y/o
plugins que se pueden utilizar para desarrollar aplicacio-
nes en Haskell. La mayoría son open source, pero también
existen de índole comercial.
5.1 Open Source
• IntelliJ plugin for Haskell
• EclipseFP plugin for Eclipse IDE
• Colorer plugin for Eclipse IDE
• Leksah
• KDevelop
• Vim
• Emacs
• Atom
5.2 Comerciales
• Haskell for Mac
• Sublime-Haskell
6 Comunidad
6.1 The Haskell Symposium
“The Haskell Symposium” es un simposio anual organi-
zado por la International Conference on Functional Pro-
gramming (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 len-
guaje. El alcance del simposio incluye todos los aspectos
del diseño, la semántica, la teoría, la aplicación, la ejecu-
ción, y la enseñanza de Haskell.
Antes de 2008, el evento era conocido como "The Has-
kell 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.
6.2 The Summer of Haskell
"The Summer of Haskell" es un evento organizado por
haskell.org para llegar a los estudiantes y animarles a con-
tribuir 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.
7 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” | n == 0 = 1 | otherwise
= product [1..n]
Función sumatorio de los elementos de una lista de ente-
ros
--Sumar elementos de una lista sumar :: [Int] -> Int
sumar [] = 0 sumar (x:xs) = x+sumar(xs)
Función para calcula las raíces de una ecuación de segun-
do 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
4. 4 11 ENLACES EXTERNOS
Función que aproxima el número e
--Función para calcular el valor de e
(2.71828182845905) euler :: Double -> Double eu-
ler 0.0 = 1.0 euler n = 1.0 / product [1..n] + euler (n
- 1.0) --Algoritmo de ordenación quicksort qs::Ord
a=>[a]->[a] qs [] = [] qs (p:xs) = qs [x|x<-xs,x<p] ++ [p]
++ qs [x|x<-xs,x>=p]
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 realizar 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]
8 Véase también
• QuickCheck
9 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 Revi-
sed Report. December de 2002.
[3] «The History of Haskell». Archivado desde el original el
23 de noviembre de 2015.
[4] Simon Peyton Jones (December de 2002). «Haskell 98
Language and Libraries: The Revised Report».
[5] «Future development of Haskell».
[6] «Welcome to Haskell'». The Haskell' Wiki.
10 Bibliografía
• Ruiz, Blas; Gutiérrez, Francisco; Guerrero, Pablo;
y Gallardo, José. Razonando con Haskell. Un curso
sobre programación funcional. Thomson.
11 Enlaces externos
Inglés:
• Haskell Página oficial de 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
• Online Bibliography of Haskell Research Bibliogra-
fía de investigaciones en Haskell
• Haskell (programming language)
• Learn You a Haskell for Great Good
Español:
• Introducción a Haskell
• Lenguaje de Programación Funcional Haskell Has-
kell 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
Implementaciones:
• Hugs Haskell User’s Gofer System
• GHC The Glasgow Haskell Compiler
• Helium, Helium
5. 5
12 Origen del texto y las imágenes, colaboradores y licencias
12.1 Texto
• Haskell Fuente: https://es.wikipedia.org/wiki/Haskell?oldid=92480016 Colaboradores: Moriel, DefLog, Janus~eswiki, Dodo, Triku, El-
wikipedista, JavierCantero, MatiasBellone, Emijrp, Rembiapo pohyiete (bot), Orgullobot~eswiki, RobotQuistnix, Chobot, Caiserbot, Yr-
bot, FlaBot, Vitamine, BOTijo, YurikBot, GermanX, KnightRider, Eskimbot, Götz, CaStarCo, Chlewbot, Tomatejc, Rbonvall, Tamorlan,
CEM-bot, SanIctícola, Toranks, Alexav8, Jvillais, Thijs!bot, Makam~eswiki, JoaquinFerrero, Diablo Cris, JAnDbot, Wybot, Nueva era,
Muro de Aguas, TXiKiBoT, Elisardojm, Rei-bot, Jcabot, VolkovBot, Matdrodes, Muro Bot, El Pantera, SieBot, Fpina7, Loveless, Wilson
Fisk, Grace Pahuasi, Taty2007, AVBOT, HavokCR, Luckas-bot, FariBOT, Simeon87, Xqbot, D'ohBot, Amarco90, Ripchip Bot, Emaus-
Bot, Guarddon, Grillitus, WikitanvirBot, Mjbmrbot, Antonorsi, MerlIwBot, JABO, KLBot2, Federicobond, Antimaterial, Syrusakbary,
Elvisor, MahdiBot, Pablo Darko, BenjaBot, Freinn, Tincho morales01, Juan-Miguel Gracia y Anónimos: 59
12.2 Imágenes
• Archivo:Haskell-Logo.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/1/1c/Haskell-Logo.svg Licencia: Public domain
Colaboradores: Thompson-Wheeler logo on the haskell wiki Artista original: Thought up by Darrin Thompson and produced by Jeff Wheeler
12.3 Licencia del contenido
• Creative Commons Attribution-Share Alike 3.0