




























































































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Llenguatges de Programació, Profesor: Pedro Garcia, Carrera: Enginyeria tèc. en informàtica de gestió, Universidad: URV
Tipo: Guías, Proyectos, Investigaciones
1 / 134
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!





























































































Inform´atica – Haskell – Matem´aticas – Curso 2004- Pepe Gallardo – Universidad de M´alaga
X Razonando con Haskell. Un curso sobre programaci´on funcional. Blas Ruiz, Francisco Guti´errez, Pablo Guerrero y Jos´e Gallardo. Thomson,
X Introduction to Functional Programming using Haskell. Richard Bird. Prentice Hall, 1998.
X The Haskell School of Expression. Learning Functional Programming through multimedia. Paul Hudak. Cambridge University Press, 2000.
X Haskell. The Craft of Functional Programming. Simon Thompson. Addison-Wesley, 1999.
Pepe Gallardo.
Despacho 3.2.50.
http://www.lcc.uma.es/∼pepeg/mates
X Programar: especificar c´omo resolver un problema.
X Un modo natural de describir programas es mediante funciones.
X El estilo funcional est´a basado en expresiones:
¶ Un programa es un conjunto de definiciones de funciones ma- tem´aticas
¶ El programador define funciones
¶ El ordenador eval´ua la expresi´on
X Ventajas:
¶ Permite escribir programas claros, concisos y con alto nivel de abstracci´on
¶ Soporta Software reusable
¶ Facilita el uso de la verificaci´on formal
Usaremos Haskell 98
http://haskell.org
Haskell es un lenguaje funcional
X Puro:
¶ Una misma expresi´on denota siempre el mismo valor (Transparen- cia referencial).
¶ Verificaci´on formal relativamente f´acil.
X No estricto:
¶ El orden utilizado para reducir expresiones es normal.
¶ Las implementaciones de Haskell suelen usar evaluaci´on perezosa.
¶ Permite trabajar con estructuras infinitas.
X Fuertemente tipado:
¶ Cada elemento tiene un tipo.
¶ Se usa para comprobar el uso consistente de los elementos.
¶ Usos inconsistentes dan lugar a errores de tipo.
¶ Muchos errores se detectan pronto.
X Se usa tambi´en la notaci´on currificada:
f :: Integer → Integer → Integer f x y = x + y + 2
doble :: Integer → Integer doble x = x + x
cuadruple :: Integer → Integer cuadruple x = doble (doble x )
Significado:
nombre fun
f
tiene tipo
Tipo Arg 10
Integer →
Tipo Arg 20
Integer →
Tipo Res
Integer
nombre fun
par. 10
par. 20
se define
resultado
X Nombres de funci´on: comienzan por min´uscula
f f ′^ fun 3 fun 3
X Nombres de par´ametros: comienzan por min´uscula
x y x ′^ x 1 xs
X Nombres de tipos: comienzan por may´uscula
Integer Bool Char
El ordenador funciona como una calculadora o evaluador:
Valores num´ericos enteros:
3 :: Integer
Valores reales:
? cos pi − 1. 0 :: Double
Solo los argumentos compuestos van entre par´entesis:
? cos (2 ∗ pi)
Ejemplo m´as elaborado:
[1, 2 , 3 , 4 , 5] :: [Integer ]
? sum [1..10] 55 :: Integer
El evaluador calcula el resultado de una expresi´on utilizando las definicio- nes de las funciones involucradas.
Ejemplo
cuadrado :: Integer → Integer cuadrado x = x ∗ x
2 + cuadrado 3 ===> {por la definici´on de cuadrado} 2 + (3 ∗ 3) ===> {por el operador (∗)} 2 + 9 ===> {por el operador (+)} 11
X Cada uno de los pasos efectuados es una reducci´on.
X En cada reducci´on, el evaluador busca una parte de la expresi´on que sea simplificable (redex o reducto) y la simplifica.
X Cuando una expresi´on no puede ser reducida m´as se dice que est´a en forma normal.
X Labor del ordenador: buscar un redex en la expresi´on, reducirlo y repetir este proceso hasta que la expresi´on est´e en forma normal.
La definici´on del comportamiento del evaluador dada es ambigua.
¿Qu´e pasa cuando hay m´as de un redex?
Podemos reducir la expresi´on desde dentro hacia fuera (reducir primero aquellos reductos m´as anidados).
cuadrado :: Integer → Integer cuadrado x = x ∗ x
cuadrado(cuadrado 3) ===> {por la definici´on de cuadrado} cuadrado(3 ∗ 3) ===> {por el operador (∗)} cuadrado 9 ===> {por la definici´on de cuadrado} 9 ∗ 9 ===> {por el operador (∗)} 81
Esta estrategia presenta problemas.
Transparencia referencial: una misma expresi´on denota siempre el mismo valor.
Consecuencia:
X Sea cual sea la estrategia seguida en las reducciones, el resultado final (el valor 81) coincide (si se alcanza).
X La elecci´on de un redex equivocado puede hacer que no se obtenga la forma normal de una expresi´on.
Ejemplo:
infinito :: Integer infinito = 1 + infinito
cero :: Integer → Integer cero x = 0
Comportamiento esperado ∀ n :: Integer. cero n ===> 0.
Si reducimos siempre el redex m´as interno:
cero inf inito ===> {por definici´on de infinito} cero (1 + inf inito) ===> {por definici´on de infinito} cero (1 + (1 + inf inito)) ===> {por definici´on de infinito}
...
Si reducimos el redex m´as externo:
cero inf inito ===> {por definici´on de cero} 0
La estrategia utilizada para seleccionar el redex es crucial, ya que puede hacer que se obtenga o no la forma normal de la expresi´on.
X Seleccionar en cada reducci´on el redex m´as interno (el m´as anidado).
X En caso de que existan varios reductos que cumplan la condici´on an- terior, se selecciona el que aparece m´as a la izquierda en la expresi´on.
Esto significa que
X Ante una aplicaci´on de funci´on, se reducen primero los argumentos de la funci´on para obtener sus correspondientes valores (paso de par´ametros por valor).
A los evaluadores que utilizan este orden se los llama estrictos o impa- cientes.
Problemas:
X A veces, se efect´uan reducciones que no son necesarias:
cero (10 ∗ 4) ===> {por el operador (∗)} cero 40 ===> {por definici´on de cero} 0
X No encuentra la forma normal de ciertas expresiones:
cero inf inito ===> {por definici´on de infinito} cero (1 + inf inito) ===> {por definici´on de infinito} cero (1 + (1 + inf inito)) ===> {por definici´on de infinito}
...
La Evaluaci´on perezosa soluciona este problema.
Evaluaci´on perezosa = paso por nombre + recordar los valores de los argumentos ya calculados (evita que el c´alculo se repita)
Cada expresi´on se representa mediante un grafo.
⇓
⇐=
cuadrado cuadrado^3 ===>^ *
81 ⇐= -^ * æ
La reducci´on de la figura la escribiremos como:
cuadrado (cuadrado 3) ===> {por la definici´on de cuadrado} a ∗ a donde a = cuadrado 3 ===> {por la definici´on de cuadrado} a ∗ a donde a = b ∗ b donde b = 3 ===> {por el operador (∗)} a ∗ a donde a = 9 ===> {por el operador (∗)} 81
No se realizar´an m´as reducciones que utilizando paso por valor.
Posee las ventajas del paso por nombre y no es menos eficiente que el paso por valor.
El alumno debe:
X Conocer las bases del estilo de programaci´on funcional
X Conocer las principales caracter´ısticas de Haskell
X Conocer la notaci´on currificada de Haskell
X Conocer los principales ´ordenes de reducci´on: aplicativo y normal
X Conocer las principales ventajas e inconvenientes de cada orden de reducci´on
X Saber reducir expresiones utilizando los distintos ´ordenes
X Un tipo es una colecci´on de valores relacionados.
¶ Integer es el conjunto de los enteros { ..., − 3 , − 2 , − 1 , 0 , 1 , 2 , 3 , ... }
X La notaci´on e :: T indica que la expresi´on e tiene tipo T.
¶ Por ejemplo 10 :: Integer
X Cualquier expresi´on tiene un tipo.
X Antes de evaluar una expresi´on se comprueba que los tipos son consis- tentes (chequeo de tipos).
X Los valores de este tipo representan expresiones l´ogicas cuyo resultado puede ser verdadero o falso.
X Solo hay dos valores para el tipo: True y False.
Comportamiento de las funciones anteriores:
v 1 v 2 v1 && v 2 v 1 || v 2 T rue T rue T rue T rue T rue F alse F alse T rue F alse T rue F alse T rue F alse F alse F alse F alse
v not v T rue F alse F alse T rue
? True && False False :: Bool
? not (True && False) True :: Bool