Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Guia de Haskell, Guías, Proyectos, Investigaciones de Programación Lineal

Asignatura: Llenguatges de Programació, Profesor: Pedro Garcia, Carrera: Enginyeria tèc. en informàtica de gestió, Universidad: URV

Tipo: Guías, Proyectos, Investigaciones

Antes del 2010

Subido el 09/02/2007

javincho
javincho 🇪🇸

3.9

(62)

9 documentos

1 / 134

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Inform´atica Haskell Matem´aticas Curso 2004-2005
Pepe Gallardo Universidad de alaga
Temario
1 Introducci´on y sem´antica operacional
2 Tipos predefinidos
3 Patrones y Definiciones de Funciones
4 Funciones de orden superior
5 Polimorfismo
6 Definiciones de tipos
7 El sistema de clases
8 Listas
9´
Arboles
10 Razonamiento ecuacional
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Vista previa parcial del texto

¡Descarga Guia de Haskell y más Guías, Proyectos, Investigaciones en PDF de Programación Lineal solo en Docsity!

Inform´atica – Haskell – Matem´aticas – Curso 2004- Pepe Gallardo – Universidad de M´alaga

Temario

1 Introducci´on y sem´antica operacional

2 Tipos predefinidos

3 Patrones y Definiciones de Funciones

4 Funciones de orden superior

5 Polimorfismo

6 Definiciones de tipos

7 El sistema de clases

8 Listas

9 ´Arboles

10 Razonamiento ecuacional

Bibliograf´ıa

X Razonando con Haskell. Un curso sobre programaci´on funcional. Blas Ruiz, Francisco Guti´errez, Pablo Guerrero y Jos´e Gallardo. Thomson,

  1. (http://www.lcc.uma.es/RazonandoConHaskell)

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.

Profesor

Pepe Gallardo.

Despacho 3.2.50.

[email protected]

Web asignatura

http://www.lcc.uma.es/∼pepeg/mates

1.1 Programaci´on Funcional

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

1.2 El lenguaje Haskell

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.

Definici´on de funciones

X Se usa tambi´en la notaci´on currificada:

  • – Un comentario g :: Integer → Integer g x = x + 1

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

︸︷︷︸f

nombre fun

︸︷︷︸^ x

par. 10

︸︷︷︸^ y

par. 20

︸︷︷︸^ =

se define

x ︸ + ︷︷y + 2 ︸

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

1.4 Sesiones y declaraciones

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)

  1. 0 :: Double

Ejemplo m´as elaborado:

? [1..5]

[1, 2 , 3 , 4 , 5] :: [Integer ]

? sum [1..10] 55 :: Integer

1.5 Reducci´on de expresiones

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.

Reducci´on desde dentro hacia fuera

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.

Importancia de la estrategia de reducci´on

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.

Orden de reducci´on aplicativo

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}

...

Evaluaci´on Perezosa

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.

⇐=

  • 3 æ

cuadrado cuadrado^3 ===>^ *

  • cuadrado 3æ
  • 9 æ

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.

Objetivos del tema

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

2.1 Tipos en Haskell

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

2.2 Tipos simples predefinidos

El tipo Bool

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.

Funciones y operadores

  • ( && ) :: Bool → Bool → Bool conjunci´on l´ogica.
  • ( || ) :: Bool → Bool → Bool disyunci´on l´ogica.
  • not :: Bool → Bool negaci´on l´ogica.
  • otherwise :: Bool funci´on constante que devuelve el valor True.

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