Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y...

60
Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia http://www.dsic.upv.es/~slucas

Transcript of Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y...

Page 1: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Un lenguaje funcional avanzado:

Haskell

Salvador Lucas AlbaDepartamento de Sistemas Informáticos y Computación

Universidad Politécnica de Valencia

http://www.dsic.upv.es/~slucas

Page 2: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

ObjetivosObjetivos

• Introducir la sintaxis básica de Haskell

•Aprender a utilizar el intérprete Hugs para ejecutar programas escritos en Haskell

Page 3: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

DesarrolloDesarrollo

1. Introducción a Haskell

2. Nivel léxico

3. Expresiones

4. Declaraciones

Page 4: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

DesarrolloDesarrollo

1. Introducción a Haskell

2. Nivel léxico

3. Expresiones

4. Declaraciones

Page 5: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Características principales

• Permite al usuario definir sus propios tipos y estructuras de datos

• Dispone de los tipos predefinidos usuales (booleanos, enteros, caracteres, cadenas, …) con las operaciones predefinidas habituales

• Soporta distintos niveles de polimorfismo:– Polimorfismo paramétrico– Polimorfismo ‘ad-hoc’ (sobrecarga)

Introducción a HaskellIntroducción a Haskell

Page 6: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Características principales

• Un programa es un conjunto de definiciones de función realizadas mediante ecuaciones condicionales

• Pueden emplearse expresiones let y where así como las reglas de ‘layout’

• Funciones de orden superior

• La evaluación de expresiones es ‘perezosa’ (lazy)

Introducción a HaskellIntroducción a Haskell

Page 7: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Características principales

• Los programas pueden organizarse en modulos o ‘librerías’

• Los programas Haskell suelen llevar la extensión ‘hs’.

• El módulo Prelude.hs contiene definiciones de tipos y funciones que pueden utilizarse de forma inmediata en cualquier programa

Introducción a HaskellIntroducción a Haskell

Page 8: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Introducción a HaskellIntroducción a Haskell

Importación/Exportación de módulos

Definición de tipos y estructuras de datos

Definición de funciones

Module ProgHaskell

Page 9: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Introducción a HaskellIntroducción a Haskell

Definición de tipos y estructuras de datos

Definición de funciones

Prelude.hs

Page 10: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

DesarrolloDesarrollo

1. Introducción a Haskell

2. Nivel léxico

3. Expresiones

4. Declaraciones

Page 11: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Un identificador Haskell consta de una letra seguida por cero o más letras, dígitos, subrayados y comillas simples.

• Los identificadores son case-sensitive (el uso de minúsculas o mayúsculas importa)

Nivel léxicoNivel léxicoIdentificadores

Page 12: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Como en todos los lenguajes, hay ‘palabras reservadas’:

case, data, deriving, do, else, if, import, let, module, of, then, type, where…

• La letra inicial del identificador distingue familias de identificadores: empiezan por– Mayúscula los tipos y constructores de datos– Minúscula los nombres de función y variables

Nivel léxicoNivel léxicoIdentificadores

Page 13: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Nivel léxicoNivel léxico

• Ejemplo: Bool, Int, Char, String (predef)• data Color = Red | Green | Blue• data Laboral = Lu | Ma | Mi | Ju | Vi• data TreeInt = L Int | B TreeInt TreeInt• data Tree t = L t | B (Tree t) (Tree t)

Constructores de tipos

Constructores de datosVariables de tipoMayusc. Minusc.

Identificadores

Page 14: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Nivel léxicoNivel léxico

Constructores de datosNombres de función

Mayusc. Minusc.

• Ejemplo:

fact n | n==0 = 1

| n>0 = n*fact (n-1)

length [] = 0

length (x:xs) = 1+length xs

Variables

Page 15: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Se pueden especificar operadores: cadenas de símbolos escogidos entre

!, #, $, %, &, *, +, -, ., /, <, =, >, ?, @, \, :,…

• Ejemplo: +!+, <&, <=>, …

• Si queremos utilizar el operador como constructor de datos debe empezar por ‘:’

Nivel léxicoNivel léxicoOperadores

Page 16: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Un trozo de texto en un programa puede ‘comentarse’ encerrándolo entre

{- -}

o bien, si es una sola línea, precediéndolo de

--

Nivel léxicoNivel léxicoComentarios

Page 17: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Los enteros se escriben de la manera habitual:

0, 45, -3452, 2147493647

• Los números en coma flotante también:0.31426, -23.12, 567.347,

4523.0

231.61e7, 231.6e-2, -3.412e03

Números

Nivel léxicoNivel léxico

Page 18: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Caracteres

• Los caracteres se escriben así:– ‘a’, ‘b’, ..., ‘A’, ‘B’, ..., ‘1’, ‘2’, ...– ‘\a’, ‘\b’, ‘\f’, ‘\n’, ‘\r’, ...– ‘\BEL’, ‘\BS’, ‘\FF’, ‘\LF’, ‘\CR’, ...– ‘\7’, ‘\8’, ‘\12’, ‘\10’, ‘\13’, ...– ‘\o7’, ‘\o10’, ‘\o14’, ‘\o12’, ‘\o15’– ‘\x7’, ‘\x8’, ‘\xC’, ‘\xA’, ‘\xD’, ...

Nivel léxicoNivel léxico

Page 19: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Cadenas

• Los cadenas de caracteres son secuencias de caracteres entre comillas dobles:

– “”, – “1&bA”,– “Esta frase \10ocupa dos lineas”

Nivel léxicoNivel léxico

Page 20: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

DesarrolloDesarrollo

1. Introducción a Haskell

2. Nivel léxico

3. Expresiones

4. Declaraciones

Page 21: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Dado un nombre de función

f

y expresiones

e1, e2, …, ek

la expresión

( f e1 e2 ··· ek )

representa la llamada a la función f con argumentos e1, e2, …, ek

Llamada a una función

ExpresionesExpresiones

¡Paréntesis externos!

¡No hay ‘comas’!

Page 22: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Ejemplos:

(fact 10)

(length “abcd”)

(fact (length “abcd”))

ExpresionesExpresionesLlamada a una función

Page 23: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• También es válido:

fact 10

length “abcd”

fact (length “abcd”)

ExpresionesExpresionesLlamada a una función

Page 24: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

ExpresionesExpresionesUtilización de operadores

• Dado un operador (binario)

y expresiones

e1, e2

la expresión

(e1 e2)

representa la aplicación del operador a sus argumentos e1, e2

Page 25: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Ejemplos:

(10 + 3)

(“abcd” ++ “123”)

((a:“bcd” ) ++ “123”)

ExpresionesExpresionesUtilización de operadores

Page 26: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• También es válido:

10 + 3

“abcd” ++ “123”

(a:“bcd” ) ++ “123”

ExpresionesExpresionesUtilización de operadores

Page 27: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Por supuesto, se pueden combinar

fact (10 + 3)

length (“abcd” ++ “123”)

length ((a:“bcd” ) ++ “123”)

ExpresionesExpresiones

Page 28: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• La expresión condicional puede utilizarse en su sintaxis ‘infija’:

fact n = if n==0 then 1 else n*(fact (n-1))

ExpresionesExpresionesCondicionales

Page 29: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

ExpresionesExpresionesListas

• Por su frecuente uso en programación funcional, se han desarrollado (y se admiten) distintas notaciones para expresar listas:

1:2:3:[] (igual a 1:(2:(3:[])) )

[1,2,3]

1:[2,3]

corresponden a la misma lista

(:) es asociativo por la derecha

Page 30: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

ExpresionesExpresionesListas

• La notación de listas aritméticas permite expresar secuencias de enteros:

[2..10] es [2,3,4,5,6,7,8,9,10]

[1..] es [1,2,3,4,...

[1,3..10] es [1,3,5,7,9]

[1,3..] es [1,3,5,7,9,...

Page 31: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

ExpresionesExpresionesListas

• También se puede utilizar para expresar secuencias de caracteres o booleanos:

[’a’..’e’] es “abcde”

[False ..] es [False,True]

[’a’,’e’..’z’] es “aeimquy”

Page 32: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Expresiones lambda

• Una función f se describe mediante una expresión lambda de la forma

\ x1 · · · xk -> e

• Las variables x1, ..., xk son distintas entre sí y las únicas que aparecen en la expresión e

ExpresionesExpresiones

Page 33: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Expresiones lambda• Ejemplo

\ x y -> x+y

\ x -> 2*x

\ x -> True

\ m n -> B (L m) (L n)

ExpresionesExpresiones

Page 34: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

DesarrolloDesarrollo

1. Introducción a Haskell

2. Nivel léxico

3. Expresiones

4. Declaraciones

Page 35: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Tipos definidos por el usuario

DeclaracionesDeclaraciones

• Los tipos ‘de usuario’ se definen junto con los valores que éstos contienen

• Ejemplos:• data Color = Red | Green | Blue• data Laboral = Lu | Ma | Mi | Ju | Vi• data TreeInt = L Int | B TreeInt TreeInt• data Tree t = L t | B (Tree t) (Tree t)

Page 36: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Los valores se obtienen considerando la definición de tipo como una gramática:– Los constructores de datos son símbolos

terminales

– Los constructores de tipo son símbolos no terminales

• Los valores del tipo son los términos del lenguaje generado por la gramática

Tipos definidos por el usuario

DeclaracionesDeclaraciones

Page 37: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Ejemplo:

Int := 0 | 1 | 2 | 3 | ··· | -1 | -2 | -3 | ···

TreeInt := L Int | B TreeInt TreeInt

Valores de este tipo son:

L 1, L -10, B (L 1) (L 10), B (B (L 1) (L1)) (L -1)

Tipos definidos por el usuario

DeclaracionesDeclaraciones

Page 38: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

1

4

2 3

(B (L 1) (B (B (L 2) (L 3)) (L 4)))

• Ejemplo de valor del tipo TreeInt

Tipos definidos por el usuario

DeclaracionesDeclaraciones

Page 39: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Las siguientes expresiones:

L (1+1)

B (B (L 1) (L (length “ab”))) (L (fact 2))

son del tipo TreeInt, pero no son valores (contienen símbolos no constructores)

Tipos definidos por el usuario

DeclaracionesDeclaraciones

Page 40: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Definición de funciones• En los lenguajes funcionales, lo normal es definir las funciones mediante ecuaciones empleando (y combinando) distintas técnicas:

– parámetros formales– guardas– ajuste de patrones– distinción de casos– cláusulas where

DeclaracionesDeclaraciones

Page 41: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Parámetros formales

Definición de funcionesDefinición de funciones

• Una función f se describe mediante ecuaciones de la forma:

f x1 · · · xk = r

• Las variables x1, ..., xk son distintas entre sí y las únicas que aparecen en la parte derecha r

Page 42: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Definición de funcionesDefinición de funciones

• Ejemplos:

doble x = x+xtriple x = 3*xseisveces x = doble (triple x)fact n = if n==0 then 1 else n*fact (n-1)

Parámetros formales

Page 43: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Definición de funcionesDefinición de funciones

• Ejemplos:

doble x = x + xtriple x = 3 * x

Funciones primitivas

Parámetros formales

Page 44: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Definición de funcionesDefinición de funciones

• Ejemplos:

doble x = x+xtriple x = 3*xseisveces x = doble (triple x)

Otras funciones de usuario

Parámetros formales

Page 45: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Definición de funcionesDefinición de funciones

• Ejemplos:

doble x = x+xtriple x = 3*xseisveces x = doble (triple x)fact n = if n==0 then 1 else n*fact (n-1)

Recursividad

Parámetros formales

Page 46: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Parámetros formales y guardas

Definición de funcionesDefinición de funciones

• Una función f se describe mediante ecuaciones de la forma:

f x1 · · · xk | c = r

donde c es una expresión booleana

Page 47: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Parámetros formales y guardas

Definición de funcionesDefinición de funciones

• Ejemplos:

fact n | n==0 = 1 | n>0 = n*fact (n-1)sign x | x<0 = neg | x==0 = cero | x>0 = pos

Page 48: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Parámetros formales y guardas

Definición de funcionesDefinición de funciones

• Ejemplos:

Guardas

fact n | n==0 = 1 | n>0 = n*fact (n-1)sign x | x<0 = neg | x==0 = cero | x>0 = pos

Page 49: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Ajuste de patrones

Definición de funcionesDefinición de funciones

• Una función f se describe mediante ecuaciones de la forma:

f p1 · · · pk = r

• Los patrones p1, ..., pk son términos constituidos por constructores de datos y variables

Page 50: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Ejemplos:

length [] = 0length (x:xs) = 1+length xs data Nat = Cero | S Nat

first Cero _ = []first (S n) (x:xs) = x:(first n xs)

Ajuste de patrones

Definición de funcionesDefinición de funciones

Page 51: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

• Ejemplos:

Patrones

Patrones

Ajuste de patrones

Definición de funcionesDefinición de funciones

length [] = 0length (x:xs) = 1+length xs data Nat = Cero | S Nat

first Cero _ = []first (S n) (x:xs) = x:(first n xs)

Page 52: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Ajuste de patrones

Definición de funcionesDefinición de funciones

• Una expresión e se ajusta a un patrón p (pattern matching) si e puede verse como una concreción de p (dando ciertos valores a las variables libres de p)

Page 53: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Ajuste de patrones

Definición de funcionesDefinición de funciones

• Ejemplo: la expresión S (S Cero) se ajusta al patrón S x pero no al patrón Cero

S (S Cero)

S x Cero

S (S Cero)

X{x := S Cero}

Page 54: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Ajuste de patrones

Definición de funcionesDefinición de funciones

El ajuste de patrones permite clasificar datos y explorar / recuperar subestructuras de los mismos

Page 55: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Distinción de casos

Definición de funcionesDefinición de funciones

• Una función f se describe mediante ecuaciones de la forma:

f p1 · · · pk = case x of q1 -> e1

... qn -> en

• Donde p1 · · · pk, q1 · · · qn son patrones, x es una variable y e1 · · · en expresiones

Page 56: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Distinción de casos

Definición de funcionesDefinición de funciones

• Ejemplo:

length xs = case xs of [ ] -> 0 (y:ys) -> 1+length ys

Page 57: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Cláusulas where

Definición de funcionesDefinición de funciones

• Una función f se describe mediante ecuaciones de la forma:

f p1 · · · pk = e where l1 = r1

... ln = rn

• Donde l1 · · · ln son patrones o partes izquierdas de definiciones de función, y r1 · · · rn son expresiones

Page 58: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

Definición de funcionesDefinición de funciones

• Ejemplo:

raicesEc2 a b c = ((-b+d)/a’,(-b-d)/a’)where

d = sqrt(b^2-4*a*c) a’ = 2*a

Cláusulas where

Page 59: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

BibliografíaBibliografía

[Bir00] R. Bird. Introducción a la Programación Funcional con Haskell. Prentice-Hall, Madrid, 2000.

[Dav92] A.J. Davie. An Introduction to Functional Programming Systems Using Haskell. Cambridge University Press, Cambridge, UK, 1992.

[Pey03] S. Peyton Jones, editor. Haskell 98: Language and Libraries. The Revised Report. Cambridge University Press, 2003.

Página WWW de Haskell:

http://www.haskell.org

Page 60: Un lenguaje funcional avanzado: Haskell Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia slucas.

:=