60
Un lenguaje funcional avanzado: Haskell

Intro haskell

Embed Size (px)

DESCRIPTION

una introduccion al lenguaje gaskell...

Citation preview

Page 1: Intro haskell

Un lenguaje funcional avanzado:

Haskell

Page 2: Intro haskell

Objetivos

• Introducir la sintaxis básica de Haskell

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

Page 3: Intro haskell

Desarrollo

1. Introducción a Haskell

2. Nivel léxico

3. Expresiones

4. Declaraciones

Page 4: Intro haskell

Desarrollo

1. Introducción a Haskell

2. Nivel léxico

3. Expresiones

4. Declaraciones

Page 5: Intro haskell

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 Haskell

Page 6: Intro haskell

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 Haskell

Page 7: Intro haskell

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 Haskell

Page 8: Intro haskell

Introducció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: Intro haskell

Introducción a Haskell

Definición de tipos y estructuras de datos

Definición de funciones

Prelude.hs

Page 10: Intro haskell

Desarrollo

• Introducción a Haskell

• Nivel léxico

• Expresiones

• Declaraciones

Page 11: Intro haskell

• 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éxicoIdentificadores

Page 12: Intro haskell

• 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éxicoIdentificadores

Page 13: Intro haskell

Nivel 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: Intro haskell

Nivel 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: Intro haskell

• 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éxicoOperadores

Page 16: Intro haskell

• 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éxicoComentarios

Page 17: Intro haskell

• 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éxico

Page 18: Intro haskell

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éxico

Page 19: Intro haskell

Cadenas

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

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

Nivel léxico

Page 20: Intro haskell

Desarrollo

• Introducción a Haskell

• Nivel léxico

• Expresiones

• Declaraciones

Page 21: Intro haskell

• 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

Expresiones

¡Paréntesis externos!

¡No hay ‘comas’!

Page 22: Intro haskell

• Ejemplos:

(fact 10)

(length “abcd”)

(fact (length “abcd”))

ExpresionesLlamada a una función

Page 23: Intro haskell

• También es válido:

fact 10

length “abcd”

fact (length “abcd”)

ExpresionesLlamada a una función

Page 24: Intro haskell

ExpresionesUtilizació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: Intro haskell

• Ejemplos:

(10 + 3)

(“abcd” ++ “123”)

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

ExpresionesUtilización de operadores

Page 26: Intro haskell

• También es válido:

10 + 3

“abcd” ++ “123”

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

ExpresionesUtilización de operadores

Page 27: Intro haskell

• Por supuesto, se pueden combinar

fact (10 + 3)

length (“abcd” ++ “123”)

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

Expresiones

Page 28: Intro haskell

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

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

ExpresionesCondicionales

Page 29: Intro haskell

ExpresionesListas

• 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: Intro haskell

ExpresionesListas

• 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: Intro haskell

ExpresionesListas

• 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: Intro haskell

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

Expresiones

Page 33: Intro haskell

Expresiones lambda

• Ejemplo

\ x y -> x+y

\ x -> 2*x

\ x -> True

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

Expresiones

Page 34: Intro haskell

Desarrollo

• Introducción a Haskell

• Nivel léxico

• Expresiones

• Declaraciones

Page 35: Intro haskell

Tipos definidos por el usuario

Declaraciones

• 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: Intro haskell

• 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

Declaraciones

Page 37: Intro haskell

• 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

Declaraciones

Page 38: Intro haskell

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

Declaraciones

Page 39: Intro haskell

• 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

Declaraciones

Page 40: Intro haskell

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

Declaraciones

Page 41: Intro haskell

Parámetros formales

Definició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: Intro haskell

Definició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: Intro haskell

Definición de funciones

• Ejemplos:

doble x = x + xtriple x = 3 * x

Funciones primitivas

Parámetros formales

Page 44: Intro haskell

Definición de funciones

• Ejemplos:

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

Otras funciones de usuario

Parámetros formales

Page 45: Intro haskell

Definició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: Intro haskell

Parámetros formales y guardas

Definició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: Intro haskell

Parámetros formales y guardas

Definició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: Intro haskell

Parámetros formales y guardas

Definició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: Intro haskell

Ajuste de patrones

Definició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: Intro haskell

• 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 funciones

Page 51: Intro haskell

• Ejemplos:

Patrones

Patrones

Ajuste de patrones

Definició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: Intro haskell

Ajuste de patrones

Definició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: Intro haskell

Ajuste de patrones

Definició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: Intro haskell

Ajuste de patrones

Definición de funciones

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

Page 55: Intro haskell

Distinción de casos

Definició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: Intro haskell

Distinción de casos

Definición de funciones

• Ejemplo:

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

Page 57: Intro haskell

Cláusulas where

Definició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: Intro haskell

Definició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: Intro haskell

Bibliografí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: Intro haskell

λ :=