Objetivos
El objetivo de este tema es introducir algunos de los conceptos fundamentales de la Programacin Funcional y del lenguaje Haskell: Conocer las caractersticas principales de los lenguajes funcionales, y algunas de sus aplicaciones Conocer de forma intuitiva los conceptos de funcin y tipo, y cmo se puede modelar un problema en trminos de funciones que operan sobre argumentos Conocer cmo se enfoca la programacin en el paradigma funcional, y la evaluacin como mecanismo para la resolucin de problemas Familiarizarse con la denicin de valores y funciones en Haskell
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 2
Objetivos (II)
Conocer la nocin de prueba como mecanismo para la demostracin de propiedades de programas
ndice
1. Lenguajes Funcionales 1.1. Historia de los lenguajes funcionales . . . . . . . . . . . 1.2. Ventajas y desventajas . . . . . . . . . . . . . . . . . . . 1.3. Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . 2. El lenguaje Haskell 3. Funciones 4. Tipos 5. Un ejemplo: imgenes 2D (1ra aprox.) 6. Expresiones y su evaluacin 6 8 10 12 15 17 18 19 22
7. Deniciones 8. Denicin de funciones 9. Un ejemplo: imgenes 2D (2da aprox.) 10. Prueba 11. Tipos (en programacin funcional) 12. Evaluacin paso a paso
25 27 32 36 38 40
1 Lenguajes Funcionales
Los lenguajes funcionales se apoyan en la denicin de funciones y hacen uso de la aplicacin y composicin de funciones, adems de considerar las funciones como objetos La utilizacin que se hace de funciones facilita la abstraccin y modularizacin a la hora de programar, p.e. dada la similaridad de las funciones:
fact n
| | sumInt n | |
= = = =
1 n * fact(n-1) 0 n + sumInt(n-1)
induction base comb n | n==0 = base | n>0 = comb n (induction base comb (n-1))
. . . y reescribir las funciones originales como sigue:
1.3 Aplicaciones
Existen aplicaciones en el mundo real implementadas con lenguajes funcionales en mbitos muy variadosa : Industriales, p.e. Shop.com Merchant System (base de datos para e-comercio), Peval (evaluador parcial para planicacin de compaias areas) Compiladores, intrpretes y evaluadores parciales Herramientas sintcticas, p.e. Ebnf2ps (traductor de gramticas EBNF a cheros postcript) Demostradores de teoremas
a
Ver http://homepages.inf.ed.ac.uk/wadler/realworld/index.html
2 El lenguaje Haskell
Haskell
a
Muchos de los aspectos que estudiaremos son de inters para otros lenguajes funcionales (o para otros tipos de lenguajes de programacin) Haskell ha sido revisado varias veces desde su especicacin inicial (a nales de los 80) hasta el estndar actual (Haskell 98) Existen diferentes implementaciones de Haskell (ver
http://www.haskell.org/)
a
Nombre en honor de Haskell B. Curry, pionero en el lambda clculo teora matemtica de funciones
http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e)
3 Funciones
Una funcin es algo que produce una salida (resultado) a partir de un valor/unos valores de entrada (argumentos o parmetros) Representaremos una funcin mediante una caja con una o varias entradas y una salida, p.e.
inputs output
4 Tipos
Las funciones aceptan como argumentos y producen como resultado datos de clases variadas, p.e. flipV acepta una imagen y devuelve otra;
En el modelado de un problema, los tipos representan conceptos mientras que las funciones representan operaciones sobre los mismos
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 18
scale: escalado
scale 2
superimpose: superposicin
superimpose
above
sideBySide
6 Expresiones y su evaluacin
La evaluacin de expresiones aritmticas nos es familiar, p.e.
(7 3) 2 8
En general: expresion evaluacion valor
...
f lipV
. . . o podemos considerar la expresin invertColour(flipV horse):
f lipV
invertColour
7 Deniciones
Un programa Haskell est formado por una serie de deniciones Una denicin asocia un nombre (o identicador) con un valor de un tipo determinado, p.e.
7 Deniciones (II)
Ms ejemplos, donde se suponen denidas todas las funciones sobre imgenes y el valor horse
blackHorse :: Picture blackHorse = invertColour horse rotatedHorse :: Picture rotatedHorse = flipH (flipV horse)
La evaluacin del valor en la ltima denicin puede verse como
f lipV
f lipH
8 Denicin de funciones
La denicin de funciones es similar a la de valores, p.e.
square 5 = 5 * 5
La denicin de funciones, en general: nombre x1 x2... xk = e donde nombre es el nombre de la funcin, x1 x2... xk son los parmetros formales y e el resultado en funcin de los parmetros Adems, se ha de incluir la declaracin del tipo de la funcin:
.......##... .....##..#.. ...##.....#. ..#.......#. ..#...#...#. ..#...###.#. .#....#..##. ..#...#..... ...#...#.... ....#..#.... .....#.#.... ......##....
flipH En el reejo respecto a la horizontal, las lneas no cambian, pero su orden se invierte: flipH = reverse
donde reverse es una funcin Haskell
flipV En el reejo respecto a la vertical el orden de las lneas no cambia, pero s cada lnea, que se invierte: flipV = map reverse
donde map es una funcin Haskell que aplica una funcin dada a cada uno de los elementos de una lista
above Para concatenar dos imgenes en la vertical se pueden concatenar las listas: above = (++)
donde ++ es una funcin Haskell que une dos listas en una
10 Prueba
Una prueba es una argumentacin lgica o matemtica que demuestra que algo se cumple bajo cualquier circunstancia La prueba pueder ser de utilidad p.e. para hallar equivalencias entre dos expresiones funcionales Por ejemplo: Es interesante observar que al componer flipH y flipV obtendremos el mismo resultado sea cual sea el orden de las funciones, o sea: flipH . flipV = flipV . flipH
(flipProp)
Se puede demostrar que (flipProp) se cumple basndonos en que (1) flipV altera el orden dentro de cada lnea pero no el de las lneas en la imagen, y (2) flipH cambia el orden de las lneas pero no el que hay dentro de cada una
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 36
10 Prueba (II)
Una ventaja de demostrar propiedades mediante prueba es que podemos tener la certeza de que (la implementacin de) nuestras funciones las cumplen Atencin!!! La vericacin mediante prueba no sustituye sino que complementa a la validacin por medio de test Las pruebas son posibles en cualquier lenguaje de programacin, pero son ms sencillas en los lenguajes funcionales
notar que en cada expresin se ha subrayado la parte que se modica en la siguiente lnea y que a la derecha de cada expresin se indica mediante qu deniciones se ha obtenido
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 41
The End
Copyright c 2005 Mar Marcos (Mar.Marcos@icc.uji.es)
Made with the ujislides document class c 2002-3 Sergio Barrachina (barrachi@icc.uji.es)