Programación Funcional Haskell Clase 19 José Raymundo Marcial Romero rmarcial@fi.uaemex.mx BUAP c José Raymundo Marcial Romero. Clase Número 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 sesión Creación y edición de scripts Carga y ejecución de scripts Otros comandos útiles c José Raymundo Marcial Romero. Clase Número 19 p.2/23
Lenguajes Imperativos y Funcionales Lenguaje humano = lenguaje Natural Sentencias en lenguaje natural Imperativas Declarativas Interrogativas Exclamativas En lenguajes de programación: Sentencias Imperativas x := 5 Sentencias declarativas function f(int x) { return x+1;} c José Raymundo Marcial Romero. Clase Número 19 p.3/23
Lenguajes Imperativos y Funciones La distinción entre construcciones imperativas y declarativas se basa en la distinción entre cambiar un valor existente y declarar 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 programación en el cual la mayoría de cálculos se realiza mediante la evaluación de expresiones que contienen funciones. Ejemplos: Lisp, ML y Haskell. c José Raymundo Marcial Romero. Clase Número 19 p.4/23
Lenguajes Funcionales-1 Los lenguajes funcionales ofrecen al programador un buen número de recursos que permiten resolver problemas complejos mediante programas pequeños y robustos. Sistema de tipos polimórficos. Definir funciones que aceptan otras funciones. Definir y manipular estructuras de datos infinitas. Modelo computacional simple, claro y bien fundamentado. c José Raymundo Marcial Romero. Clase Número 19 p.5/23
Lenguajes Funcionales-2 Quick sort en un lenguaje funcional qsort [] = [] 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 José Raymundo Marcial Romero. Clase Número 19 p.6/23
Lenguajes Funcionales-3 qsort( 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 José Raymundo Marcial Romero. Clase Número 19 p.7/23
Quién 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 programación funcional, Erlang, que se utilizará en sus aplicaciones de teléfono. Query es el lenguaje de consulta del sistema de base de datos orientado a objetos O 2 ICAD Inc market un sistema CAD para ingeniería mecánica y aeronáutica. c José Raymundo Marcial Romero. Clase Número 19 p.8/23
Haskell y Hugs Haskell es un lenguaje de programación funcional lazy Programar en un lenguaje de programación funcional consiste en construir definiciones de funciones (matemáticas) y estructuras de datos, y expresiones que usan estas definiciones. La ejecución de un programa funcional consiste en la evaluación de las expresiones que forman el programa. HUGS significa Haskell Users Gofer System. Provee un intérprete el cual acepta el lenguaje Haskell. El uso de Hugs consiste de: inicio de sesiones creación de scripts c José Raymundo Marcial Romero. Clase Número 19 p.9/23
Sesiones El rol primario de la computadora es actuar como un evaluador: Escribimos una expresión seguida de una nueva ĺınea. La computadora evalúa la expresión, y muestra el resultado. Prelude> 63 la expresión 63 está en su forma más simple 63 Prelude> 7*9 7*9 se simplifica realizando la multiplicación 63 Prelude> False && True False c José Raymundo Marcial Romero. Clase Número 19 p.10/23
Script - 1 Un 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 sesión que utiliza script.hs Prelude> :load script.hs script> square 12 144 script> greater (square 3, 4+3) 9 c José Raymundo Marcial Romero. Clase Número 19 p.11/23
Valores y Representaciones En programación funcional una expresión denota un valor. Los valores pueden ser: números 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 más de una representación. Cuarenta se puede representar como 40 ó 8*5. Hugs imprime un valor, en su representación canónica. La forma canónica de cuarenta es 40. La forma canónica de cualquier expresión depende de: la sintaxis para construir la expresión; Las reglas de evaluación (ó reducción). c José Raymundo Marcial Romero. Clase Número 19 p.12/23
Evaluación - 1 Evaluar una expresión significa reducirla a su forma equivalente más simple, que es su representación canónica. Los términos evaluación, simplificación y reducción son equivalentes. Pueden existir diferentes secuencias de reducción para evaluar la misma expresión: square (3+2) square (3+2) = por la definición de + = por la definición de square square 5 (3+2) * (3+2) = por la definición de square = por la definición de + 5*5 5 * (3+2) = por la definición de * por la definición de + 25 5*5 = por la definiciónde * 25 c José Raymundo Marcial Romero. Clase Número 19 p.13/23
Evaluación Lazy Algunas veces las reducciones no terminan: three :: Integer -> Integer infinity :: Integer three x = 3 infinity x = infinity + 1 three infinity three infinity = por definición de infinity = por definición de three three (infinity + 1) 3 = por definición de infinity three ((infinity +1)+1)... Haskell es un lenguaje Lazy: implementa una estrategia de reducción llamada evaluación lazy que garantiza terminación siempre y cuando sea posible. c José Raymundo Marcial Romero. Clase Número 19 p.14/23
Funciones y Operadores Función: regla de correspondencia que asocia cada elemento de un tipo A con un único elemento de tipo B delta :: (Float, Float, Float) -> Integer plusc :: Integer -> (Integer -> Integer) La aplicación 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 función binaria que se puede escribir entre sus dos argumentos (notación infija): 5 <= 9 15 div 4 c José Raymundo Marcial Romero. Clase Número 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 cláusulas, delimitadas por una barra vertical por cada cláusula una condición c José Raymundo Marcial Romero. Clase Número 19 p.16/23 y una expresión asociada a ésta.
Considere lo siguiente: Definiciones-2 signum:: Integer -> Integer signum x = if x<0 then -1 else if x==0 then 0 else 1 Si se utilizan ecuaciones guarded la definición es más clara: signum:: Integer -> Integer signum x x<0 = -1 x==0 = 0 x>0 = 1 c José Raymundo Marcial Romero. Clase Número 19 p.17/23
Tipos El universo de valores esta particionado en colecciones organizadas llamadas tipos. Existen operaciones asociadas con cada tipo. Cada expresión bien formada tiene asignado un tipo (strong typing) Permite detectar ciertos errores antes de la evaluación Le crea al programador una buena disciplina de escritura de programas c José Raymundo Marcial Romero. Clase Número 19 p.18/23
Tipos básicos y operadores Tipos Valores Operadores Bool True y False (or) && not (no) Eq clases con igualdad ==(Igual) /= (Diferente) Ord Clases de orden < > <= >= min max Int Entero de precisión simple + - *? Integer Entero de precisión arbitraria Integral Integer Int gcd lcm div mod Float Punto flotante de precisión simple Double Punto flotante de precisión doble Fraction Float Double / x div y = x/y donde x es el entero n más grande tal que n x x = (x div y) y + (x mod y) c José Raymundo Marcial Romero. Clase Número 19 p.19/23
Inicio y Termino de sesiones Bajo 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 gráfica c José Raymundo Marcial Romero. Clase Número 19 p.20/23
Creación y Edición de scripts Los scripts son colecciones de definiciones que se pueden almacenar en un archivo. Los archivos que terminan con la extensión hs siempre se consideran como scripts de Hugs Si desea escribir comentario hay dos formas { y } o. Ejemplos. {- Esto es un comentario -} -- También 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 José Raymundo Marcial Romero. Clase Número 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 intérprete 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 estarán disponibles en el interprete. Las definiciones en el script se pueden utilizar para formar nuevas expresiones. Cuando se evalúan estas expresiones, el interprete utiliza las definiciones que están en el script para simplificar las reglas. c José Raymundo Marcial Romero. Clase Número 19 p.22/23
Comandos Útiles :? Muestra la lista de comandos :load <Archivo.hs> Carga los módulos del archivo :l Archivo.hs :load Sólo Prelude estará disponible :type <exprt> Imprime el tipo de la expresión :t (+) :info <names> describe los objetos nombrados :i Fractional :edit <Archivo.hs> Archivo en edición :!comando comandos del shell :!ls :cd dir cambia el directorio :quit Sale del intérprete c José Raymundo Marcial Romero. Clase Número 19 p.23/23