Programacion Funcional Haskell Clase 19mtovar/doc/FLP/Clase19.pdf · Programacion Funcional Haskell...
Transcript of Programacion Funcional Haskell Clase 19mtovar/doc/FLP/Clase19.pdf · Programacion Funcional Haskell...
Programacion FuncionalHaskellClase 19
Jose Raymundo Marcial [email protected]
BUAP
c©Jose Raymundo Marcial Romero. Clase Numero 19 – p.1/23
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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