Post on 03-Jul-2015
description
Un lenguaje funcional avanzado:
Haskell
Objetivos
• Introducir la sintaxis básica de Haskell
•Aprender a utilizar el intérprete Hugs para ejecutar programas escritos en Haskell
Desarrollo
1. Introducción a Haskell
2. Nivel léxico
3. Expresiones
4. Declaraciones
Desarrollo
1. Introducción a Haskell
2. Nivel léxico
3. Expresiones
4. Declaraciones
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
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
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
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
Introducción a Haskell
Definición de tipos y estructuras de datos
Definición de funciones
Prelude.hs
Desarrollo
• Introducción a Haskell
• Nivel léxico
• Expresiones
• Declaraciones
• 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
• 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
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
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
• 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
• 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
• 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
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
Cadenas
• Los cadenas de caracteres son secuencias de caracteres entre comillas dobles:
– “”, – “1&bA”,– “Esta frase \10ocupa dos lineas”
Nivel léxico
Desarrollo
• Introducción a Haskell
• Nivel léxico
• Expresiones
• Declaraciones
• 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’!
• Ejemplos:
(fact 10)
(length “abcd”)
(fact (length “abcd”))
ExpresionesLlamada a una función
• También es válido:
fact 10
length “abcd”
fact (length “abcd”)
ExpresionesLlamada a una función
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
• Ejemplos:
(10 + 3)
(“abcd” ++ “123”)
((a:“bcd” ) ++ “123”)
ExpresionesUtilización de operadores
• También es válido:
10 + 3
“abcd” ++ “123”
(a:“bcd” ) ++ “123”
ExpresionesUtilización de operadores
• Por supuesto, se pueden combinar
fact (10 + 3)
length (“abcd” ++ “123”)
length ((a:“bcd” ) ++ “123”)
Expresiones
• La expresión condicional puede utilizarse en su sintaxis ‘infija’:
fact n = if n==0 then 1 else n*(fact (n-1))
ExpresionesCondicionales
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
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,...
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”
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
Expresiones lambda
• Ejemplo
\ x y -> x+y
\ x -> 2*x
\ x -> True
\ m n -> B (L m) (L n)
Expresiones
Desarrollo
• Introducción a Haskell
• Nivel léxico
• Expresiones
• Declaraciones
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)
• 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
• 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
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
• 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
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
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
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
Definición de funciones
• Ejemplos:
doble x = x + xtriple x = 3 * x
Funciones primitivas
Parámetros formales
Definición de funciones
• Ejemplos:
doble x = x+xtriple x = 3*xseisveces x = doble (triple x)
Otras funciones de usuario
Parámetros formales
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
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
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
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
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
• 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
• 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)
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)
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}
Ajuste de patrones
Definición de funciones
El ajuste de patrones permite clasificar datos y explorar / recuperar subestructuras de los mismos
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
Distinción de casos
Definición de funciones
• Ejemplo:
length xs = case xs of [ ] -> 0 (y:ys) -> 1+length ys
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
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
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
λ :=