programacion funcional haskell clase 19 - cs.buap.mxmtovar/doc/flp/clase19.pdf · ejemplos: lisp,...

23
Programaci´ on Funcional Haskell Clase 19 Jos´ e Raymundo Marcial Romero [email protected] BUAP c Jos´ e Raymundo Marcial Romero. Clase N´ umero 19 – p.1/23

Upload: vanthien

Post on 30-Sep-2018

227 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Programacion FuncionalHaskellClase 19

Jose Raymundo Marcial [email protected]

BUAP

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.1/23

Page 2: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Temas de la clase• Lenguajes Funcionales

• Haskell y Hugs

• Sesiones y scripts

• Valores y Representaciones

• Evaluaciones

• Funciones y Operadores

• Definiciones

• Tipos

• Una sesion de Hugs

• Comenzar y terminar una sesion

• Creacion y edicion de scripts

• Carga y ejecucion de scripts

• Otros comandos utiles

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.2/23

Page 3: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Lenguajes Imperativos y Funcionales• Lenguaje humano = lenguaje Natural

• Sentencias en lenguaje natural

• Imperativas

• Declarativas

• Interrogativas

• Exclamativas

• En lenguajes de programacion:

• Sentencias Imperativas

x := 5

• Sentencias declarativas

function f(int x) { return x+1;}

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.3/23

Page 4: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Lenguajes Imperativos y FuncionesLa distincion entre construcciones imperativas y declarativasse basa en la distincion entre cambiar un valor existente ydeclarar un nuevo valor.

{ int x=1; /* declara una nueva variable x */

x = x+1; /* asigna un valor a x */

{ int y=x+1; /* declara una nueva variable y */

{ int x=y+1; /* declara una nueva x */

}}}

Lenguaje funcional: se utiliza para referirse a un lenguaje de

programacion en el cual la mayorıa de calculos se realiza mediante la

evaluacion de expresiones que contienen funciones.

Ejemplos: Lisp, ML y Haskell.

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.4/23

Page 5: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Lenguajes Funcionales-1• Los lenguajes funcionales ofrecen al programador un

buen numero de recursos que permiten resolverproblemas complejos mediante programas pequenos yrobustos.

• Sistema de tipos polimorficos.

• Definir funciones que aceptan otras funciones.

• Definir y manipular estructuras de datos infinitas.

• Modelo computacional simple, claro y bienfundamentado.

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.5/23

Page 6: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Lenguajes Funcionales-2Quick sort en un lenguaje funcionalqsort [] = []

qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x

where

elts_lt_x = [y | y <- xs, y < x]

elts_greq_x = [y | y <- xs, y >= x]

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.6/23

Page 7: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Lenguajes Funcionales-3qsort( a, lo, hi ) int a[], hi, lo;

{

int h, l, p, t;

if (lo < hi) {

l = lo;

h = hi;

p = a[hi];

do {

while ((l < h) && (a[l] <= p))

l = l+1;

while ((h > l) && (a[h] >= p))

h = h-1;

if (l < h) {

t = a[l];

a[l] = a[h];

a[h] = t;

}

} while (l < h);

t = a[l];

a[l] = a[hi];

a[hi] = t; qsort( a, lo, l-1 ); qsort( a, l+1, hi );

} }c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.7/23

Page 8: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Quien utiliza lenguajes funcionales• Software AG, una de las mayores empresas de software en

Alemania vende un sistema experto.

• Ericsson ha desarrollado un nuevo lenguaje de programacion

funcional, Erlang, que se utilizara en sus aplicaciones de

telefono.

• Query es el lenguaje de consulta del sistema de base de datos

orientado a objetos O2

• ICAD Inc market un sistema CAD para ingenierıa mecanica y

aeronautica.

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.8/23

Page 9: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Haskell y Hugs• Haskell es un lenguaje de programacion funcional ”lazy”

• Programar en un lenguaje de programacion funcional consiste

en construir definiciones de funciones (matematicas) y

estructuras de datos, y expresiones que usan estas definiciones.

La ejecucion de un programa funcional consiste en la

evaluacion de las expresiones que forman el programa.

• HUGS significa Haskell Users’ Gofer System. Provee un

interprete el cual acepta el lenguaje Haskell. El uso de Hugs

consiste de:

• inicio de sesiones

• creacion de scripts

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.9/23

Page 10: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

SesionesEl rol primario de la computadora es actuar como un evaluador:

• Escribimos una expresion seguida de una nueva lınea.

• La computadora evalua la expresion, y muestra el resultado.

Prelude> 63 la expresion 63 esta en su forma mas simple

63

Prelude> 7*9 7*9 se simplifica realizando la multiplicacion

63

Prelude> False && True

False

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.10/23

Page 11: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Script - 1Un script se guarda como un archivo script.hs

// Ejemplo de un script

square :: Integer -> Integer

square x = x*x

greater:: (Integer, Integer) -> Integer

greater (x,y) = if x>=y then x else y

Una sesion que utiliza script.hs

Prelude> :load script.hs

script> square 12

144

script> greater (square 3, 4+3)

9

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.11/23

Page 12: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Valores y Representaciones• En programacion funcional una expresion denota un valor. Los

valores pueden ser: numeros de varias clases, valores de

verdad, funciones, caracteres, tuplas, listas.

• Los valores se reconocen y manipulan vıa representaciones

concretas. El mismo valor puede tener mas de una

representacion. Cuarenta se puede representar como 40 o 8*5.

• Hugs imprime un valor, en su representacion canonica. La

forma canonica de cuarenta es 40. La forma canonica de

cualquier expresion depende de:

• la sintaxis para construir la expresion;

• Las reglas de evaluacion (o reduccion).

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.12/23

Page 13: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Evaluacion - 1• Evaluar una expresion significa reducirla a su forma

equivalente mas simple, que es su representacion canonica.

Los terminos evaluacion, simplificacion y reduccion son

equivalentes.• Pueden existir diferentes secuencias de reduccion para evaluar

la misma expresion:

square (3+2) square (3+2)

= por la definicion de + = por la definicion de square

square 5 (3+2) * (3+2)

= por la definicion de square = por la definicion de +

5*5 5 * (3+2)

= por la definicion de * por la definicion de +

25 5*5

= por la definicionde *

25

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.13/23

Page 14: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Evaluacion Lazy• Algunas veces las reducciones no terminan:

three :: Integer -> Integer infinity :: Integer

three x = 3 infinity x = infinity + 1

three infinity three infinity

= por definicion de infinity = por definicion de three

three (infinity + 1) 3

= por definicion de infinity

three ((infinity +1)+1)

...

• Haskell es un lenguaje Lazy: implementa una estrategia de

reduccion llamada evaluacion lazy que garantiza terminacion

siempre y cuando sea posible.

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.14/23

Page 15: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Funciones y Operadores• Funcion: regla de correspondencia que asocia cada elemento

de un tipo A con un unico elemento de tipo B

• delta :: (Float, Float, Float) -> Integer

• plusc :: Integer -> (Integer -> Integer)

• La aplicacion de funciones tiene precedencia

• square square 3 significa (square square) 3, ası que

debemos escribir square (square 3)

• square 3+4 significa (square 3) +4 ası que debemos

escribir square (3+4).• Operador: una funcion binaria que se puede escribir entre sus

dos argumentos (notacion infija):• 5 <= 9

• 15 ‘div‘ 4

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.15/23

Page 16: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Definiciones- 1

Declaraciones pi:: Float

3.14159

Expresiones condicionales greater:: (Integer,Integer)->Integer

greater(x,y)=if x>=y then x else y

Ecuaciones guarded greater:: (Integer,Integer)->Integer

greater(x,y)

| x>=y = x

| x<y = y

• sintaxis de expresiones guarded:

• Una secuencia de clausulas, delimitadas por una barra

vertical

• por cada clausula una condicion

• y una expresion asociada a esta.c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.16/23

Page 17: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Definiciones-2Considere lo siguiente:

signum:: Integer -> Integer

signum x = if x<0 then -1 else

if x==0 then 0 else 1

Si se utilizan ecuaciones guarded la definicion es mas clara:

signum:: Integer -> Integer

signum x

| x<0 = -1

| x==0 = 0

| x>0 = 1

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.17/23

Page 18: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Tipos• El universo de valores esta particionado en colecciones

organizadas llamadas tipos.

• Existen operaciones asociadas con cada tipo.

• Cada expresion bien formada tiene asignado un tipo (strong

typing)

• Permite detectar ciertos errores antes de la evaluacion

• Le crea al programador una buena disciplina de escritura

de programas

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.18/23

Page 19: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Tipos basicos y operadoresTipos Valores Operadores

Bool True y False || (or) && not (no)

Eq clases con igualdad ==(Igual) /= (Diferente)

Ord Clases de orden < > <= >= min max

Int Entero de precision simple + - * ?

Integer Entero de precision arbitraria

Integral Integer Int gcd lcm div mod

Float Punto flotante de precision simple

Double Punto flotante de precision doble

Fraction Float Double /

x div y = ⌊x/y⌋ donde ⌊x⌋ es el entero n mas grande tal que n ≤ x

x = (x div y) ∗ y + (x mod y)

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.19/23

Page 20: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Inicio y Termino de sesionesBajo Unix

• Inicio: teclear hugs

• salir: teclar :quit o :q

Bajo Windows NT

• Elegir Inicio, Programas, Hugs98

• Elegir Hugs (Haskell98 mode) para tener la misma interfaz

que en Unix

• Elegir WinHugs para tener una interfaz grafica

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.20/23

Page 21: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Creacion y Edicion de scripts• Los scripts son colecciones de definiciones que se pueden

almacenar en un archivo.

• Los archivos que terminan con la extension hs siempre se

consideran como scripts de Hugs• Si desea escribir comentario hay dos formas {− y −} o −− .

Ejemplos.

{- Esto es un comentario -}

-- Tambien esto es un comentario

• Para crear y editar un script, se pueden utilizar los siguientes

editores:

• vi, emacs, xemacs, pico, bajo Unix

• Notepad o Wordpad, bajo Windows

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.21/23

Page 22: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Cargar y Ejecutar un script• Los scripts en Hugs se pueden cargar de la siguiente manera:

• dando los nombres de los archivos como argumentos del

comando hugs

• Utilizando el comando :load o :l dentro del interprete

Si Miarchivo.hs esta en el directorio actual

Prelude> :load Miarchivo.hs

Si Miarchivo.hs esta en el directorio ./haskell/ejercicios/

Prelude> :load ’’ haskell/ejercicios/Miarchivo.hs ’’

• Cuando se carga un script, todas las definiciones que contiene

estaran disponibles en el interprete. Las definiciones en el

script se pueden utilizar para formar nuevas expresiones.

Cuando se evaluan estas expresiones, el interprete utiliza las

definiciones que estan en el script para simplificar las reglas.

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.22/23

Page 23: Programacion Funcional Haskell Clase 19 - cs.buap.mxmtovar/doc/FLP/Clase19.pdf · Ejemplos: Lisp, ML y Haskell. c Jos´e Raymundo Marcial Romero. Clase Nu´mero 19 – p.4/23. Lenguajes

Comandos Utiles:? Muestra la lista de comandos

:load <Archivo.hs> Carga los modulos del archivo :l Archivo.hs

:load Solo Prelude estara disponible

:type <exprt> Imprime el tipo de la expresion :t (+)

:info <names> describe los objetos nombrados :i Fractional

:edit <Archivo.hs> Archivo en edicion

:!comando comandos del shell :!ls

:cd dir cambia el directorio

:quit Sale del interprete

c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.23/23