SlideShare una empresa de Scribd logo
1 de 5
Descargar para leer sin conexión
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 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ó
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 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
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

Más contenido relacionado

La actualidad más candente

Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programaciónMay Ibarra
 
3 paradigmas
3 paradigmas3 paradigmas
3 paradigmasalithu1
 
Paradigmas de programacion
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacionyamy matin
 
Paradigma de poo
Paradigma de pooParadigma de poo
Paradigma de poopixeleante
 
PARADIGMA IMPERATIVO
PARADIGMA IMPERATIVOPARADIGMA IMPERATIVO
PARADIGMA IMPERATIVOFredy Olaya
 
Paradigmas de programacion
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacionWil Mer
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructuradavnslgars
 
Estilos de programación y sus lenguajes
Estilos de programación y sus lenguajesEstilos de programación y sus lenguajes
Estilos de programación y sus lenguajesPedro Contreras Flores
 
Programacin estructurada
Programacin estructuradaProgramacin estructurada
Programacin estructuradaRubixita12
 
Leng progr 01
Leng progr 01Leng progr 01
Leng progr 01Luis Paez
 
Paradigma de Programación Orientado a Objetos
Paradigma de Programación Orientado a ObjetosParadigma de Programación Orientado a Objetos
Paradigma de Programación Orientado a ObjetosAlberto Blumberg
 
LENGUAJES DE PROGRAMACION
LENGUAJES DE PROGRAMACIONLENGUAJES DE PROGRAMACION
LENGUAJES DE PROGRAMACIONDIEGO BAROJA
 
Lenguajes de programación lógica
Lenguajes de programación lógicaLenguajes de programación lógica
Lenguajes de programación lógicaDarwin_Cusme
 

La actualidad más candente (20)

Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programación
 
3 paradigmas
3 paradigmas3 paradigmas
3 paradigmas
 
Paradigmas de programacion
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacion
 
Paradigma de poo
Paradigma de pooParadigma de poo
Paradigma de poo
 
PARADIGMA IMPERATIVO
PARADIGMA IMPERATIVOPARADIGMA IMPERATIVO
PARADIGMA IMPERATIVO
 
Paradigmas de programacion
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacion
 
Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programación
 
Programación!! . .
Programación!! . .Programación!! . .
Programación!! . .
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
 
sistema operativo
sistema operativosistema operativo
sistema operativo
 
Estilos de programación y sus lenguajes
Estilos de programación y sus lenguajesEstilos de programación y sus lenguajes
Estilos de programación y sus lenguajes
 
Programacin estructurada
Programacin estructuradaProgramacin estructurada
Programacin estructurada
 
Leng progr 01
Leng progr 01Leng progr 01
Leng progr 01
 
Paradigma de Programación Orientado a Objetos
Paradigma de Programación Orientado a ObjetosParadigma de Programación Orientado a Objetos
Paradigma de Programación Orientado a Objetos
 
LENGUAJES DE PROGRAMACION
LENGUAJES DE PROGRAMACIONLENGUAJES DE PROGRAMACION
LENGUAJES DE PROGRAMACION
 
Lenguajes de programación lógica
Lenguajes de programación lógicaLenguajes de programación lógica
Lenguajes de programación lógica
 
Lenguaje de programacion mike alvarado
Lenguaje de programacion mike alvaradoLenguaje de programacion mike alvarado
Lenguaje de programacion mike alvarado
 
1 Paradigma Objetos
1 Paradigma Objetos1 Paradigma Objetos
1 Paradigma Objetos
 
Pascal
PascalPascal
Pascal
 
Pseudocódigos
PseudocódigosPseudocódigos
Pseudocódigos
 

Similar a Haskell wikipedia

Similar a Haskell wikipedia (20)

Unidad v paradigma funcional de programacion fiuncional
Unidad v   paradigma funcional de programacion fiuncionalUnidad v   paradigma funcional de programacion fiuncional
Unidad v paradigma funcional de programacion fiuncional
 
Luna jaimes ensayo_haskellu2
Luna jaimes ensayo_haskellu2Luna jaimes ensayo_haskellu2
Luna jaimes ensayo_haskellu2
 
Diseño de progra tarea
Diseño de progra tareaDiseño de progra tarea
Diseño de progra tarea
 
Lógica De La Programación Y Lenguaje de Pascal
Lógica De La Programación Y Lenguaje de PascalLógica De La Programación Y Lenguaje de Pascal
Lógica De La Programación Y Lenguaje de Pascal
 
Tarea3
Tarea3 Tarea3
Tarea3
 
Lenguaje de programacion
Lenguaje de programacionLenguaje de programacion
Lenguaje de programacion
 
Lenguaje de programación
Lenguaje de programaciónLenguaje de programación
Lenguaje de programación
 
Perl2
Perl2Perl2
Perl2
 
Perl2
Perl2Perl2
Perl2
 
Fortran y Pascal
 Fortran y Pascal Fortran y Pascal
Fortran y Pascal
 
Bison y flex
Bison y flexBison y flex
Bison y flex
 
S11.s1 - Material.pdf
S11.s1 - Material.pdfS11.s1 - Material.pdf
S11.s1 - Material.pdf
 
Libro2 - PROGRAMACION2
Libro2 - PROGRAMACION2Libro2 - PROGRAMACION2
Libro2 - PROGRAMACION2
 
Libro 2 - ORIGENES DE LA PROGRAMACION
Libro 2 - ORIGENES DE LA PROGRAMACIONLibro 2 - ORIGENES DE LA PROGRAMACION
Libro 2 - ORIGENES DE LA PROGRAMACION
 
Baño
BañoBaño
Baño
 
El estudio de los lenguajes de programacion
El estudio de los lenguajes de programacionEl estudio de los lenguajes de programacion
El estudio de los lenguajes de programacion
 
Marina aguilar historiay_tiposdelenguajesdeprogramacion
Marina aguilar historiay_tiposdelenguajesdeprogramacionMarina aguilar historiay_tiposdelenguajesdeprogramacion
Marina aguilar historiay_tiposdelenguajesdeprogramacion
 
Presentación Lenguajes de Programación y Utilerias
Presentación Lenguajes de Programación y UtileriasPresentación Lenguajes de Programación y Utilerias
Presentación Lenguajes de Programación y Utilerias
 
El lenguage de programación Ada.pdf
El lenguage de programación Ada.pdfEl lenguage de programación Ada.pdf
El lenguage de programación Ada.pdf
 
El lenguage de programación ada
El lenguage de programación adaEl lenguage de programación ada
El lenguage de programación ada
 

Haskell wikipedia

  • 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