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