Haskell


Haskell
Haskell
Información general
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 nombre proviene del lógico Haskell Curry.

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 con y (ver más abajo) como los representantes actuales del estándar de facto. El último estándar semi-oficial es Haskell 98, con la intención de especificar 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 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 links al final de este artículo.

Contenido

Historia

A partir de la publicación de Miranda, en 1985, los lenguajes funcionales proliferaron. En 1987, existían compitiendo entre éllos 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 meeting 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.[1] La primera versión de Haskell ("Haskell 1.0") se definió en 1990.[2] 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".[3] 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").[4] Este proceso intenta producir una revisión menor de Haskell 98.[5]

Introducción a Haskell

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 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 de distintos tipos.

Por ejemplo: ('a',True,3)

Listas

Los 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:[]))))

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 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 ([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 librerías (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 ([5]) 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.

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

Véase también

Referencias

  1. «Preface». Haskell 98 Language and Libraries: The Revised Report (December de 2002).
  2. «The History of Haskell».
  3. Simon Peyton Jones (December de 2002). «Haskell 98 Language and Libraries: The Revised Report».
  4. «Future development of Haskell».
  5. «Welcome to Haskell'». The Haskell' Wiki.

Enlaces externos

Inglés:

Español:

Implementaciones:

  • Hugs Haskell User's Gofer System
  • GHC The Glasgow Haskell Compiler
  • Helium, Helium

Bibliografía

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

Wikimedia foundation. 2010.

Mira otros diccionarios:

  • Haskell — Класс языка: функциональный, ленивый, модульный Тип исполнения: компилируемый, интерпретируемый Появился в: 1990 …   Википедия

  • Haskell — Auteur le comité Haskell Développeurs la communauté Haskell …   Wikipédia en Français

  • Haskell — may refer to:*Haskell (programming language), a standardized pure functional programming language with non strict semantics * Haskell Indian Nations University, a four year degree granting university in Lawrence, Kansas which offers free tuition… …   Wikipedia

  • Haskell — ist der Familienname folgender Personen: Charles Haskell (1860–1933), US amerikanischer Politiker Colleen Haskell, US amerikanische Jung Schauspielerin Dudley C. Haskell (1843–1883), US amerikanischer Politiker Floyd K. Haskell (1916–1998), US… …   Deutsch Wikipedia

  • Haskell — es un lenguaje de programación funcional e interpretado que obtuvo su nombre del lógico Haskell Curry. Fue creado por un comité en los años 1980 con el objetivo específico de definir dicho lenguaje. El lenguaje evoluciona rápidamente con y (ver… …   Enciclopedia Universal

  • Haskell — Haskell, AR U.S. city in Arkansas Population (2000): 2645 Housing Units (2000): 762 Land area (2000): 4.621199 sq. miles (11.968849 sq. km) Water area (2000): 0.022774 sq. miles (0.058985 sq. km) Total area (2000): 4.643973 sq. miles (12.027834… …   StarDict's U.S. Gazetteer Places

  • Haskell, AR — U.S. city in Arkansas Population (2000): 2645 Housing Units (2000): 762 Land area (2000): 4.621199 sq. miles (11.968849 sq. km) Water area (2000): 0.022774 sq. miles (0.058985 sq. km) Total area (2000): 4.643973 sq. miles (12.027834 sq. km) FIPS… …   StarDict's U.S. Gazetteer Places

  • Haskell, OK — U.S. town in Oklahoma Population (2000): 1765 Housing Units (2000): 763 Land area (2000): 2.173356 sq. miles (5.628965 sq. km) Water area (2000): 0.000000 sq. miles (0.000000 sq. km) Total area (2000): 2.173356 sq. miles (5.628965 sq. km) FIPS… …   StarDict's U.S. Gazetteer Places

  • Haskell, TX — U.S. city in Texas Population (2000): 3106 Housing Units (2000): 1526 Land area (2000): 3.402575 sq. miles (8.812629 sq. km) Water area (2000): 0.000000 sq. miles (0.000000 sq. km) Total area (2000): 3.402575 sq. miles (8.812629 sq. km) FIPS code …   StarDict's U.S. Gazetteer Places

  • Haskell — ● np. m. ►LANG langage fonctionnel (voir aussi langage fonctionnel) polymorphe et typé (paresseux, en plus!), devant son nom à Haskell Brooks Curry (voir Curry, Haskell), mathématicien dont le travail a permis de jeter les bases de la… …   Dictionnaire d'informatique francophone