Anda di halaman 1dari 42

Tema 1.

Introduccin a la Programacin Funcional y al lenguaje Haskell


http://www.icc.uji.es/
Mar Marcos (Mar.Marcos@icc.uji.es) 9 de febrero de 2005

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

 Bibliografa: Temas 1 del [Thompson 1999] y


del [Rabhi and Lapalme 1999]

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 3

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

n==0 n>0 n==0 n>0

= = = =

1 n * fact(n-1) 0 n + sumInt(n-1)

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 6

1 Lenguajes Funcionales (II)


. . . podemos abstraer el mecanismo de recursin subyacente en otra funcin:

induction base comb n | n==0 = base | n>0 = comb n (induction base comb (n-1))
. . . y reescribir las funciones originales como sigue:

fact n = induction 1 (*) n sumInt n = induction 0 (+) n

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 7

1.1 Historia de los lenguajes funcionales


Los lenguajes funcionales se caracterizan tanto por lo que no tienen (no asignacin, no secuenciacin explcita) como por lo que tienen (funciones como objetos, transparencia referencial) Los primeros lenguajes funcionales no puros (p.e. Lisp ) surgieron en los 60 El inters por los lenguajes funcionales se reaviva en 1978 Gran parte de los lenguajes funcionales puros se origina en Reino Unido: lenguajes con evaluacin perezosa (lazy evaluation), p.e. SASL, KRC
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 8

1.1 Historia de los lenguajes funcionales (II)


ML (Meta Language) , lenguaje con polimorsmo e inferencia de tipos En 1986 Miranda incorpora ambas tendencias. Otros lenguajes le siguen con ligeras variaciones En 1990 se establece un comit para denir un nuevo lenguaje que integre las caractersticas anteriores, del que surge Haskell En 1999 se dene Haskell 98 , el dialecto que estudiaremos

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 9

1.2 Ventajas y desventajas


Las principales ventajas: carcter declarativo. El programador especica mediante ecuaciones lo que se ha de calcular y no cmo ha de calcularse (la secuenciacin) transparencia referencial. Como los programas son expresiones matemticas, es posible sustituir variables por valores, lo que permite manipular los programas como ecuaciones funciones de alto nivel (high-order functions). Es posible utilizar funciones como argumentos de otras funciones o devolverlas como resultado
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 10

1.2 Ventajas y desventajas (II)


polimorsmo. Se puede denir cdigo para manipular objetos de diferentes tipos siempre que el algoritmo no dependa de propiedades especcas de los mismos Entre las desventajas: menor eciencia. Aspectos como la imposibilidad de asignar/actualizar variables tienen repercusiones negativas en la eciencia falta de experiencia de los programadores. El retraso de la implementacin eciente de estos lenguajes as como de la implementacin de entornos de programacin especcos ha inuido negativamente en el nmero de usuarios
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 11

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

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 12

1.3 Aplicaciones (II)


Herramientas y aplicaciones de redes, p.e. clientes de FTP annimo de las universidades CMU y Glasgow Procesamiento del lenguaje y reconocimiento del habla, p.e. SATLITE (sistema de consultas a bases de datos en lenguaje natural) Numricas, p.e. MC-SYM (clculos 3D de molculas de cido nucleico) Web, HTML y XML, p.e. XSLT (componente para transformacin de XSL, lenguaje para dar formato a XML) Bases de Datos
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 13

1.3 Aplicaciones (III)


Sistemas Operativos, p.e. Smart-card Iluminacin y sonido Juegos

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 14

2 El lenguaje Haskell
Haskell
a

es el lenguaje de programacin funcional que estudiaremos

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

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 15

2 El lenguaje Haskell (II)


En las prcticas utilizaremos el sistema Hugs , que es un intrprete de Haskell de libre distribucin Los ejemplos que veremos estn en la web (ver

http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e)

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 16

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

El dar valores concretos a una funcin se denomina aplicacin de una funcin

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 17

4 Tipos
Las funciones aceptan como argumentos y producen como resultado datos de clases variadas, p.e. flipV acepta una imagen y devuelve otra;

scale acepta una imagen y un nmero y devuelve una imagen escalada


Un tipo es una coleccin de valores de una misma clase, tales que a todos se les puede aplicar las mismas funciones, p.e. imgenes Atencin!!! Las funciones tambin tienen un tipo, p.e.
Picture Int scale Picture

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

5 Un ejemplo: imgenes 2D (1ra aprox


Vamos a considerar un ejemplo basado en imgenes 2D binarias (blanco y negro) Distintas relaciones entre imgenes pueden ser modeladas como funciones Algunos ejemplos de funciones sobre imgenes 2D:

flipV: reejo especular respecto a la vertical


flipV

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 19

5 Un ejemplo: imgenes 2D (1ra aprox


invertColour: inversin de colores
invertColour

scale: escalado
scale 2

superimpose: superposicin

superimpose

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 20

5 Un ejemplo: imgenes 2D (1ra aprox


above: concatenacin de dos imgenes en la vertical

above

sideBySide: concatenacin de dos imgenes en la horizontal

sideBySide

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 21

6 Expresiones y su evaluacin
La evaluacin de expresiones aritmticas nos es familiar, p.e.

(7 3) 2 8
En general: expresion evaluacion valor

La evaluacin de expresiones funcionales es muy similar, p.e.

si horse es una imagen

...

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 22

6 Expresiones y su evaluacin (II)


. . . podemos considerar la expresin flipV horse, cuya evaluacin producir su reejo especular:

f lipV
. . . o podemos considerar la expresin invertColour(flipV horse):

f lipV

invertColour

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 23

6 Expresiones y su evaluacin (III)


En programacin funcional se evalan expresiones basadas en funciones (y datos) de inters para el problema a resolver

la tarea de programacin consiste en disear las funciones (y datos)


para modelar el problema Un programa funcional consta de una serie de deniciones de funciones y valores

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 24

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.

size :: Int size = 12+13


. . . asocia el nombre size con el valor de la expresin 12+13, o sea 25, que es de tipo Int (el smbolo :: se puede leer como es de tipo) notar que los nombres de funcin/valor van en minsculas mientras que los de tipo van en maysculas y que no se trata de una asignacin
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 25

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

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 26

8 Denicin de funciones
La denicin de funciones es similar a la de valores, p.e.

square :: Int -> Int square n = n * n


. . . esta denicin: indica que la funcin square (es funcin porque la denicin contiene el smbolo ->) acepta un argumento de tipo Int y devuelve un resultado de tipo Int especica que, cuando la funcin square se aplica a un argumento n cualquiera, el resultado es n * n
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 27

8 Denicin de funciones (II)


La denicin implica que square n = n * n es cierto para cualquier valor de n, p.e.

square 5 = 5 * 5

square (2+4) = (2+4) * (2+4)

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:

nombre :: t1 ->t2 ->... ->tk ->t


donde t1 t2... tk son los tipos de los correspondientes parmetros formales y t el del resultado
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 28

8 Denicin de funciones (III)


Ms ejemplos. . . La denicin de rotatedHorse anterior puede hacerse a partir de una funcin:

rotate :: Picture -> Picture rotate pic = flipH (flipV pic)


. . . que usaremos luego para rotar horse:

rotatedHorse :: Picture rotatedHorse = rotate horse

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 29

8 Denicin de funciones (IV)


El patrn que sigue rotate (primero aplicar la funcin flipV, despus aplicar flipH al resultado) es muy habitual, y puede escribirse mediante el operador composicin de funciones:

rotate :: Picture -> Picture rotate = flipH . flipV


notar que en esta denicin no hay parmetros formales Atencin!!! Podemos combinar funcionesa con el operador . de manera parecida a como combinamos nmeros con +
a

La combinacin de funciones no es posible, o no es tan inmediata, en otros lenguajes de programacin

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 30

8 Denicin de funciones (V)


En todas las deniciones hemos usado el tipo Picture y sus funciones sin conocer los detalles de la implementacin abstraccin del tipo Sus ventajas son mltiples: podemos utilizar un tipo en otras deniciones sin conocer cmo est implementado si su implementacin cambia, nuestras deniciones seguirn siendo vlidas

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 31

9 Un ejemplo: imgenes 2D (2da aprox


Vamos a representar las imgenes 2D binarias mediante matrices de caracteres Supondremos que la imagen es una lista de lneas, siendo cada una de ellas una lista de caracteres (modelo para los datos) Por ejemplo: horse podra representarse como se muestra a la derecha

.......##... .....##..#.. ...##.....#. ..#.......#. ..#...#...#. ..#...###.#. .#....#..##. ..#...#..... ...#...#.... ....#..#.... .....#.#.... ......##....

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 32

9 Un ejemplo: imgenes 2D (2da aprox


Deniremos las funciones sobre imgenes teniendo en cuenta la representacin anterior (modelo para las funciones), p.e.

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

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 33

9 Un ejemplo: imgenes 2D (2da aprox


Las deniciones anteriores son una muestra de la potencia y elegancia de la programacin funcional (en Haskell): notar que se puede utilizar reverse tanto para invertir listas de lneas como de caracteres, porque es una funcin polimrca y que se ha utilizado map, que toma como argumento una funcin a aplicar a todos los elementos de una lista y, para terminar, que map reverse es en s misma una funcin

Las funciones son objetos de primera clase, pueden ser tratadas de


forma anloga a como se tratan p.e. nmeros o imgenes
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 34

9 Un ejemplo: imgenes 2D (2da aprox


Las funciones flipH y flipV no son una excepcin. Otra funcin sobre imgenes:

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

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 35

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

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 37

11 Tipos (en programacin funcional)


El tipo de una funcin nos proporciona la informacin que necesitamos para usarla, p.e.

scale :: Picture -> Int -> Picture


. . . especica que scale toma dos argumentos, siendo el 1ro una imagen y el 2do un entero, y que el resultado ser otro entero En general, el tipo de una funcin: impone una serie de restricciones sobre cmo se ha de utilizar la funcin aclara cul es el resultado de la aplicacin (correcta) de la funcin
Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 38

11 Tipos (en programacin funcional) (


Los tipos de funciones/valores sirven para comprobar que las
funciones se estn utilizando de manera adecuada (comprobacin de tipos)

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 39

12 Evaluacin paso a paso


El funcionamiento del sistema Hugs puede verse como una simple calculadora que evala expresiones a partir de una serie de deniciones de funciones/valores Esta simplicacin describe elmente la forma en que se realizan los clculos en un programa funcional (evaluacin paso a paso) Por ejemplo: dada la denicin a continuacin

double :: Int -> Int double n = 2*n

Tema 1. Introduccin a la Programacin Funcional y al lenguaje Haskell 40

12 Evaluacin paso a paso (II)


La expresin 23 - (double (3+1)) se evaluara como sigue:

23 - (double (3+1)) 23 - (2*(3+1)) 23 - (2*4) 23 - 8 15 double


operaciones aritmticas operaciones aritmticas operaciones aritmticas

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)

Anda mungkin juga menyukai