haskell

7

Click here to load reader

Upload: max-sanchez

Post on 02-Jul-2015

463 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: haskell

Haskell 1

Haskell

Haskell

Paradigma: Funcional, no estricto, modular, fuertemente tipificado

Apareció en: 1990

Diseñado por: Universidad de Yale, Universidad de Glasgow

Tipo de dato: Fuerte, estático

Implementaciones: GHC, Hugs, NHC, Yhc, JHC

Influido por: Miranda, ML, Gofer

Ha influido a: Python

Haskell es un lenguaje de programación puramente funcional de propósito general y fuertemente tipado. Su nombreproviene del lógico Haskell Curry.En los años 1980 se constituyó un comité cuyo objetivo era crear un lenguaje funcional que reuniera lascaracterísticas de los múltiples lenguajes funcionales de la época, el más notable Miranda, y resolviera la confusióncreada por la proliferación de los mismos. El lenguaje evoluciona rápidamente con y (ver más abajo) como losrepresentantes actuales del estándar de facto. El último estándar semi-oficial es Haskell 98, con la intención deespecificar una versión mínima y compatible del lenguaje como base para futuras extensiones y para su enseñanza.Las características más interesantes de Haskell incluyen el soporte para tipos de datos y funciones recursivas, listas,tuplas, guardas y calce de patrones. La combinación de las mismas pueden resultar en algunas funciones casitriviales 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 desarrolladomuchas 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 links al final de este artículo.

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

Page 2: haskell

Haskell 2

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

Tipos simples predefinidos

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]).

fun multi(p1: real list,p2:real list)=

let

fun mult((p1),([]),(l3),(i))=p1;

fun mult(([]),(p2),(l3),(i))=p2;

fun mult(x::xs),(y::ys),(l3),(i)) = if i =length (ys) then l3

else (x * y)::mult((x),(ys),(l3),(i+1))

in

crea(mult((l1),(l2),([]),(0)))

end;

El tipo Integer

Los valores de este tipo son números enteros de precisión ilimitada que tienen las mismas funciones y operadores deltipo 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

Page 3: haskell

Haskell 3

El tipo Double

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

El tipo Char

Los valores de este tipo son caracteres que se encuentran en una masa de alta complejidad de en una suma decaracteres dados con su alta definiciónAntes de utilizar esta función en hugs debemos utilizar IMPORT CHAR antes de nuestro algoritmo

TuplasLos elementos que forman una tupla pueden ser de distintos tipos.Por ejemplo: ('a',True,3)

ListasLos valores de este tipo son una colección de elementos del mismo tipo. Existen dos constructoras para listas:• [Elementos_separados_por_comas] , por ejemplo: [1,2,3,4]• (primer_elemento:resto_de_la_lista) , por ejemplo: (1:(2:(3:(4:[]))))

ImplementacionesTodas las siguientes implementaciones cumplen en su totalidad, o casi en su totalidad, con los estándares de Haskell98 y son distribuidas bajo licencias Open Source. No se conocen implementaciones comerciales del lenguaje.• Hugs ([6]) 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 implementación a despreciar, es una de las más livianas y compatibles.

• GHC ([7]): "Glasgow Haskell Compiler" compila a código nativo en una variedad de arquitecturas y puedetambién compilar a C. Es, probablemente, uno de los compiladores más populares e incluso tiene unas cuantaslibrerías (por ejemplo OpenGL) que, aunque muy útiles, sólo funcionan bajo GHC.

• nhc98 ([8]) es otro compilador con un mejor tiempo de ejecución que Hugs. Esta implementación se enfocó aminimizar la utilización de la memoria convirtiéndola en una buena opción para arquitecturas lentas o antiguas.

• HBC ([9]) es otro compilador a código nativo de Haskell. Si bien no ha sido actualizado en el último tiempo siguesiendo bastante útil.

• Helium ([10]) es un nuevo dialecto de Haskell. Se centró en ser muy fácil de aprender; por ello, no incluyesoporte para todo el estándar de Haskell, haciendo que no sea totalmente compatible.

Ejemplos --Función recursiva para calcular el factorial de un número

factorial :: Integer -> Integer

factorial n = if n==0 then

1

else

n * factorial (n - 1)

--Sumar elementos de una lista

sumar :: [Int] -> Int

Page 4: haskell

Haskell 4

sumar [] = 0

sumar (x:xs) = x+sumar(xs)

--Función recursiva para calcular el factorial de un número usando

pseudónimos

factorial :: Integer -> Integer

factorial 0 = 1

factorial m@(n + 1) = m * factorial n

--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 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)

--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 mediante el

algoritmo de Euclides

mcd::Int->Int->Int

mcd x 0 = x

mcd x y = mcd y (mod x y)

-- Criba de eratostenes (de una lista dada [2..n] t deja solo los

numeros 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]

Page 5: haskell

Haskell 5

Véase también• QuickCheck

Referencias[1] « Preface (http:/ / haskell. org/ onlinereport/ preface-jfp. html)». Haskell 98 Language and Libraries: The Revised Report (December de

2002).[2] « The History of Haskell (http:/ / www. haskell. org/ haskell-history. html)».[3] Simon Peyton Jones (December de 2002). « Haskell 98 Language and Libraries: The Revised Report (http:/ / haskell. org/ onlinereport/ )».[4] « Future development of Haskell (http:/ / haskell. org/ haskellwiki/ Future)».[5] « Welcome to Haskell' (http:/ / hackage. haskell. org/ trac/ haskell-prime)». The Haskell' Wiki.[6] http:/ / www. haskell. org/ hugs/[7] http:/ / www. haskell. org/ ghc/[8] http:/ / www. cs. york. ac. uk/ fp/ nhc98/[9] http:/ / www. cs. chalmers. se/ ~augustss/ hbc/ hbc. html[10] http:/ / www. cs. uu. nl/ helium/

Enlaces externosInglés:

• Haskell (http:/ / www. haskell. org) Página oficial de Haskell• A Gentle Introduction to Haskell 98 (http:/ / www. haskell. org/ tutorial/ ) ( pdf (http:/ / www. haskell. org/

tutorial/ haskell-98-tutorial. pdf) format) Una simple introducción a Haskell 98• The Evolution of a Haskell Programmer (http:/ / www. willamette. edu/ ~fruehr/ haskell/ evolution. html) Una

forma cómica de ver los distintos estilos de programación en Haskell• Online Bibliography of Haskell Research (http:/ / haskell. readscheme. org) Bibliografía de investigaciones en

Haskell• Haskell (programming language)Español:

• Introducción a Haskell (http:/ / horru. lsi. uniovi. es/ ~labra/ FTP/ IntHaskell98. pdf)• Código ejemplo (http:/ / www. makam. org/ obligatorios/ ProgramacionFuncional/ src/ ) Intérprete de

proposiciones lógicas escrito en Haskell• Razonando con Haskell (http:/ / www. lcc. uma. es/ ~pepeg/ pfHaskell/ index. html) Reseña de un libro sobre

programación funcional con Haskell• Lenguaje de Programación Funcional Haskell (http:/ / www. frt. utn. edu. ar/ sistemas/ paradigmas/ Haskell. htm)

Haskell Básico• Una Introducción Agradable a Haskell (http:/ / www. lcc. uma. es/ ~blas/ pfHaskell/ gentle/ index. html) Versión

en español del libro "A Gentle Introduction to Haskell".Implementaciones:

• Hugs (http:/ / haskell. org/ hugs/ ) Haskell User's Gofer System• GHC (http:/ / haskell. org/ ghc/ ) The Glasgow Haskell Compiler• Helium (http:/ / www. cs. uu. nl/ wiki/ Helium), Helium

Page 6: haskell

Haskell 6

Bibliografía• Ruiz, Blas; Gutiérrez, Francisco; Guerrero, Pablo; y Gallardo, José. Razonando con Haskell. Un curso sobre

programación funcional. Thomson.

Page 7: haskell

Fuentes y contribuyentes del artículo 7

Fuentes y contribuyentes del artículoHaskell  Fuente: http://es.wikipedia.org/w/index.php?oldid=43875921  Contribuyentes: Alexav8, CaStarCo, DefLog, Diablo Cris, Dodo, Elwikipedista, Emijrp, Fpina7, GermanX, Grace Pahuasi,HavokCR, Janus, JavierCantero, JoaquinFerrero, Jvillais, Makam, Matdrodes, MatiasBellone, Moriel, Muro de Aguas, Nueva era, Rbonvall, SanIctícola, Simeon87, Taty2007, Templatenamespace initialisation script, Tomatejc, Toranks, Triku, Wilson Fisk, 46 ediciones anónimas

LicenciaCreative Commons Attribution-Share Alike 3.0 Unportedhttp:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/