Vous êtes sur la page 1sur 16

Programacin Funcional

Curso 2013/14 Marisa Navarro

Bibliografa Bsica
Bird, R. Introduccin a la Programacin Funcional con Haskell (2.ed), Prentice Hall. 1998 (traduccin en espaol: 2000) Thompson, S. Haskell.The Craft of Functional Programming (2.ed), Addison-Wesley. 1999. Home page de Haskell: http://www.haskell.org/

Temario
Tema 1. Introduccin. Lenguaje Haskell y sistema Hugs. Tema 2. T.D. simples. Definicin de funciones. Currificacin. Tema 3. Constructores de tipos. Ajuste de patrones. Polimorfa. Tema 4. Funciones sobre listas. Orden superior. Tema 5. Operadores sobrecargados. Clases de tipos. Tema 6. Tipos algebraicos. Induccin estructural. Tema 7. Tipos abstractos de datos. Mdulos. Tema 8. Evaluacin perezosa. Listas infinitas. Tema 9. Eficiencia. Estructuras cclicas. Tema 10. Programando con acciones: I/O.
3

Tema 1. Introduccin
Programacin Funcional: Consiste en construir definiciones de funciones y usar el ordenador para evaluar expresiones. Papel del programador: construir las definiciones de funciones que resuelvan un problema dado.

Funciones como cajas negras (1)


Qu es una funcin? Una caja negra

+
Aplicacin de una funcin? Meter argumentos/entradas 3 5

Evaluacin de una expresin? Obtener el resultado/salida 3 5

Funciones como cajas negras (2)


Tipo de una funcin? Int Int

Int

Definicin de una funcin? Interior de la caja negra Ejemplo: Int doble Int Posibles definiciones: (a) doble x = x + x (b) doble x = x 2 Evaluacin correspondiente: doble 7 7+7 14 doble 7 72 14

Una funcin puede tener distintas definiciones!


6

Funciones como cajas negras (3)


Ejemplo: funcin cudruple Int Int

cuadruple x = el nmero x cuadruplicado Una posible definicin: cuadruple x = doble (doble x) Interior de la caja cudruple:
doble doble

Evaluacin: cuadruple 7

doble (doble 7)

doble 14

28
7

Ejemplo de introduccin (1)


Suponemos un tipo Dibujo y una constante de este tipo: casa = casa :: Dibujo Funciones sobre el tipo Dibujo: reflejoV :: Dibujo Dibujo
reflejoV

reflejoH :: Dibujo Dibujo


reflejoH

Ejemplo de introduccin (2)


Nueva funcin: rotar :: Dibujo Dibujo

Cmo definir rotar en trminos de las otras funciones? rotar dib = reflejoH (reflejoV dib) = (reflejoH reflejoV) dib Tambin se puede escribir directamente como: rotar = reflejoH reflejoV
Dibujo reflejoV reflejoH Dibujo

Ejemplo de introduccin (3)


Implementacin del tipo Dibujo: type Dibujo = [Linea] -- lista de lneas type Linea = [Char] -- lista de caracteres Implementacin de las funciones bsicas del tipo Dibujo: (usar reverse para invertir listas y map que aplica una funcin a todos los elementos de una lista) reflejoH :: Dibujo Dibujo reflejoH d = reflejoV :: Dibujo Dibujo rerflejoV d =
10

Conclusiones del ejemplo


Uso de reverse para invertir un dibujo (lista de lneas) y para invertir una lnea (lista de caracteres) Polimorfa reverse :: [] [] Uso de reverse como argumento de la func. map Funcin de Orden Superior map :: () [] [] Funciones como ciudadanos de primera clase Propiedad que cumple nuestro programa: reflejoH reflejoV = reflejoV reflejoH Razonamiento formal Aplicacin: Transformacin de programas
11

Caractersticas y beneficios de la P.F.


Tipado fuerte => Errores detectados en compilacin Polimorfismo => Reutilizacin de cdigo Evaluacin perezosa => Modularidad, reusabilidad Func. orden superior => Abstracciones poderosas Gestin de memoria interna Incremento en la productividad del programador Menor salto semntico entre programador y lenguaje Programas ms cortos, claros y fciles de entender Mejor mantenimiento y mayor fiabilidad
12

Lenguaje Haskell
Lenguaje de P.F. ms moderno y de facto estndar Su nombre se debe a Haskell Brooks Curry Basado en el -clculo Con las caractersticas usuales de la P.F. + otras: clases de tipos (sobrecarga de operaciones), sistema de mdulos, I/O mondica. Usado en universidades: primer lenguaje de programacin Usado en la industria: prototipado, diseo y verifacin de hardware. The Haskell home page es: http://www.haskell.org

13

Sistema Hugs
Hugs = Haskell Users Gofer System (Gofer = Good for equational reasoning) Implementacin de Haskell que usaremos en el laboratorio. Una sesin Hugs es similar a una calculadora poderosa: Se carga un script (guin) o fichero con definiciones de funciones (+ declaraciones + comentarios) Se le pide que evale expresiones (que usan dichas funciones) Hugs tiene adems funciones y operadores predefinidos (en el script Prelude.hs que se carga automticamente)

14

Ejemplo de sesin en Hugs (1)


Slo con las funciones predefinidas:
Hugs> 2+3*4 14 Hugs> length [1,2,8,3] 4 Hugs> take 5 [2,4,6,8,10,12] [2,4,6,8,10] Hugs> take 5 [2..1000] [2,3,4,5,6] Hugs> product [1..6] 720 Hugs> 1*2*3*4*5*6 720
15

Ejemplo de sesin en Hugs (2)


Si el script prueba.hs es
doble x = x +x pares = [doble x | x < [1..20]]

se carga en memoria y podemos evaluar expresiones como:


Main> doble 6 12 Main> pares [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34, 36,38,40] Main> take 4 pares [2,4,6,8] Main> filter cond pares where cond x =(x>20 && x<30) [22,24,26,28]
16

Vous aimerez peut-être aussi