RAZONANDO CON HASKELL UN CURSO SOBRE PROGRAMACIÓN FUNCIONAL. A Charo, Pepa, Ana y Chari INTERNATIONAL THOMSON EDITORES SPAIN PARANINFO

Documentos relacionados
Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Tema 6: Funciones recursivas

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Tema 3: Tipos y clases

TÍTULO: MATEMÁTICA DISCRETA Y LÓGICA Disponibilidad

Contenido. Capítulo I Sistemas numéricos 2. Capítulo II Métodos de conteo 40

Definiciones de tipo. Sinónimos de tipo

Tema 13: Aplicaciones de programación funcional

Tema 7. El sistema de clases

PROGRAMACIÓN EN JAVA

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación

Guía del Curso IFCD052PO PROGRAMACIÓN EN JAVA

Contenido. Prefacio Orígenes de la programación orientada a objetos... 1

Tema 4: Definición de funciones

El sistema de clases de Haskell. Introducción

Tema 4: Definición de funciones

Tema 6. Definiciones de tipos

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Programación Funcional Haskell Clase 22

Introducción a Haskell. El lenguaje Haskell

ANEXO XVII DE LA RESOLUCION N

Práctica N o 1 - Programación Funcional

Tema 3. Patrones y Definiciones de Funciones

CURSO DE METODOS NUMERICOS INDICE

Tema 9: Declaraciones de tipos y clases

Tema 4.- Recursión e iteración

Introducción a Haskell. Cecilia Manzino

Tipos de datos y clases de tipos

Tema 9: Declaraciones de tipos y clases

Tema 2. Tipos predefinidos

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2017

Contenido. Contenidos interactivos... xiii Plataforma de contenidos interactivos... xviii Prefacio... xix. Parte I Fundamentos...

Procesadores de lenguaje Tema 5 Comprobación de tipos

INDICE 1.1. Información y Significado 1.2. Arreglos en C 1.3. Estructura en C 1.4. Clases en C++ 2. La Pila 2.1. Definición y Ejemplos

Tema 3. Patrones y Definiciones de Funciones

Bachillerato Internacional. Matemáticas Nivel Medio. Programa para el curso 1º ( )

ELEMENTOS DE LA MATEMATICA

Árboles generales. Un árbol es una estructura no lineal acíclica utilizada para organizar información de forma eficiente. La definición es recursiva:

1.1 Define un operador ( ) que devuelva True si y solo si tan solo uno de sus argumentos es True. Por ejemplo:? (3 > 2) (2 > 5)

LOS CONTENIDOS DE MATEMÁTICAS EN LOS BACHILLERATOS ITALIANOS

Planificaciones Algoritmos y Programación I. Docente responsable: CARDOZO MARTIN MIGUEL. 1 de 8

Tema 2: Introducción a la programación con Haskell

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

TEMARIO DE PROFESORES DE ENSEÑANZA SECUNDARIA MATEMÁTICAS

Contenido. 1. Introducción a la programación La secuenciación La selección...55

Introducción al Lambda Cálculo (C)

Guardas y Tipos de datos

Universidad Tecnológica Nacional Facultad Regional San Francisco. Tecnicatura Superior en Programación. Matemática

Ejercicios de programación funcional con Haskell

Expresión decimal. Aproximación y estimación. Notación científica. Polinomios. Divisibilidad de polinomios. Regla de Ruffini.

ÍNDICE SISTEMÁTICO. Sumario... 5 Prólogo Unidad didáctica 1. Conjuntos Objetivos de la Unidad... 13

DATOS DE IDENTIFICACIÓN DEL CURSO Ciencias Computacionales Estructuras y algoritmos

Aplicación de la Inducción Matemática Programación Funcional. Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca

GUÍA DE EXAMEN DE NUEVO INGRESO. Maestría en Optimización de Procesos

METODOLOGÍA DE LA PROGRAMACIÓN. APLICACIONES EN BASIC, COBOL Y PASCAL ÍNDICE

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

UNIVERSIDAD AUTONOMA DE QUERETARO Facultad de Informática

Tema Árboles binarios fmap para árboles binarios Plegado de árboles binarios

Prólogo del autor... xv. Agradecimientos... xvii. Parte 1. Métodos anónimos... 3

TEMARIO PRESENTACIÓN 7 MÓDULO I 17 EXPRESIONES ALGEBRAICAS 19

TEMARIO PRUEBA DE SÍNTESIS MATEMÁTICA NIVEL SÉPTIMO BÁSICO

Listas y Recursión. Taller de Álgebra I. Primer Cuatrimestre de 2015

18 Experimentos aleatorios. Sucesos y espacio muestral. Frecuencia y probabilidad de un suceso.

Tema 5: Definiciones de listas por comprensión

CARRERA DE CIECNIAS DE LA COMPUTACIÓN PROGRAMA DE ESTUDIO. Teóricos: 2 Práctico: 1 Total 3

Tema 5: Definiciones de listas por comprensión

Programación en Lenguaje C

Tema 12: Analizadores sintácticos funcionales

Programación funcional

Introducción rápida a la programación (estructurada ) con C++

Introducción a la Programación Genérica

Tema 3: Características de la programación funcional. Sesión 5: El paradigma funcional (1)

Construcciones del Lenguaje Java

Tema 1: Programación Funcional

Lenguajes de Programación Programación funcional

Fundamentos de programación JAVA

PROGRESION 1er L 2017

Programación Inicial. Requisitos previos. Objetivos. Próximos Inicios. Modalidad a Distancia. Costo y formas de pago. Resumen de Contenidos

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Números enteros (cortos, largos y sin signo) Números reales (precisión simple y doble) Carácter y cadenas de caracteres. Lógicos.

Materia: Matemáticas Curso: Noveno de Básica BREVE DESCRIPCIÓN DE LA CLASE:

Tutoría Completa - Curso de Matemática para 1, 2 y 3 Básico

Contenido. Prólogo... Capítulo 1. Algoritmos y estructuras de datos Introducción... 24

ESTRUCTURAS DE DATOS Y ALGORITMOS

Programa Oficial de Asignatura. Ficha Técnica. Presentación. Competencias y/o resultados del aprendizaje. Contenidos Didácticos

Tema 1. Tema 2. Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga

Fundamentos de Programación Visual Basic

Programa Oficial de Asignatura. Ficha Técnica. Presentación. Competencias y/o resultados del aprendizaje. Fundamentos de Programación

Divisibilidad y congruencia

PROGRAMACIÓN ORIENTADA POR OBJETOS EN JAVA

Al final, qué sabré hacer?... Itinerario del proceso de aprendizaje... Capítulo 1. Conceptos generales a modo de introducción (CG)

n! = 1 2 n 0! = 1 (n+1)! = (n + 1) n!

MATEMÁTICAS. PRIMERO DE E.S.O.

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Programación Funcional Haskell Clase 19

Transcripción:

RAZONANDO CON HASKELL UN CURSO SOBRE PROGRAMACIÓN FUNCIONAL A Charo, Pepa, Ana y Chari INTERNATIONAL THOMSON EDITORES SPAIN PARANINFO

hola

Blas Carlos Ruiz Jiménez, Francisco Gutiérrez López y José Enrique Gallardo Ruiz Profesores del Departamento de Lenguajes y Ciencias de la Computación Pablo Guerrero García Profesor del Departamento de Matemática Aplicada E.T.S.I. Informática. Universidad de Málaga RAZONANDO CON HASKELL UN CURSO SOBRE PROGRAMACIÓN FUNCIONAL Málaga, enero de 2004

c Blas C. Ruiz, Francisco Gutiérrez, Pablo Guerrero y José E. Gallardo Edita: Imprime: ISBN:... Depósito Legal:... Composición: Realizada por los autores en LATEX2ɛ.

ÍNDICE GENERAL Índice de figuras Prólogo Convenios XIII XVII XXIII I Programación funcional básica con HASKELL 98 1 1. Programación funcional 3 1.1. Funciones................................ 3 1.2. Sesiones y declaraciones......................... 4 1.3. Reducción de expresiones........................ 6 1.3.1. Órdenes de reducción aplicativo y normal........... 9 1.3.2. Evaluación perezosa...................... 9 1.4. Sobre HASKELL............................. 11 2. Introducción a HASKELL 13 2.1. El lenguaje HASKELL.......................... 13 2.2. Tipos simples predefinidos....................... 15 2.2.1. El tipo Bool.......................... 15 2.2.2. El tipo Int........................... 16 2.2.3. El tipo Integer......................... 16 2.2.4. El tipo Float.......................... 17 2.2.5. El tipo Double......................... 18 2.2.6. El tipo Char.......................... 18 2.2.7. Operadores de igualdad y orden................ 19 2.3. Constructores de tipos predefinidos................... 20 2.3.1. Tuplas............................. 20 2.3.2. Listas.............................. 21 2.3.3. El constructor de tipo ( )................... 22 2.4. Comentarios............................... 24 2.5. Operadores................................ 24 2.5.1. Operadores frente a funciones................. 27 2.6. Comparación de patrones........................ 28 2.6.1. Patrones constantes....................... 29

VI Índice general 2.6.2. Patrones para listas....................... 32 2.6.3. Patrones para tuplas...................... 33 2.6.4. Patrones aritméticos...................... 34 2.6.5. Patrones nombrados o seudónimos.............. 35 2.6.6. El patrón subrayado...................... 36 2.6.7. Errores comunes........................ 36 2.6.8. Patrones y evaluación perezosa................ 37 2.7. Expresiones case............................ 38 2.8. La función error............................. 38 2.9. Funciones a trozos............................ 39 2.10. Expresiones condicionales........................ 40 2.11. Definiciones locales........................... 41 2.12. Expresiones lambda........................... 42 2.13. Sangrado................................. 43 2.14. Ámbitos y módulos........................... 45 2.15. Ejercicios................................ 46 3. Funciones de orden superior y polimorfismo 49 3.1. Parcialización.............................. 49 3.1.1. Aplicación parcial....................... 51 3.1.2. Secciones............................ 54 3.1.3. Funciones de orden superior.................. 56 3.1.4. Una función de orden superior sobre naturales........ 58 3.2. Polimorfismo............................... 60 3.2.1. La composición de funciones................. 62 3.2.2. Otras funciones polimórficas.................. 65 3.2.3. Polimorfismo en listas..................... 67 3.2.4. Polimorfismo en tuplas..................... 69 3.2.5. Un iterador polimórfico sobre los naturales.......... 70 4. Definición de tipos 71 4.1. Sinónimos de tipo............................ 71 4.2. Definición de tipos de datos....................... 72 4.2.1. Tipos enumerados....................... 72 4.2.2. Uniones............................. 73 4.2.3. Productos............................ 74 4.2.4. Tipos recursivos........................ 78 4.2.5. Tipos parametrizados (o polimórficos)............. 87 4.2.6. Definiciones newtype..................... 89 4.3. Propiedades de funciones........................ 90 4.3.1. La propiedad universal de foldnat.............. 97 4.4. Sobrecarga y polimorfismo restringido................. 99 4.4.1. Un ejemplo de sobrecarga................... 101 4.5. Ejercicios................................ 103

Índice general VII 5. El sistema de clases de HASKELL 105 5.1. Tipos y clases de tipos. Jerarquía de clases............... 105 5.1.1. El sistema de clases...................... 105 5.1.2. Declaración de clase...................... 109 5.1.3. La clase Eqde PRELUDE.................... 111 5.2. Contextos................................ 112 5.2.1. Instancias paramétricas.................... 115 5.3. Subclases. La clase Ord de PRELUDE................. 115 5.3.1. Un ejemplo: los enteros módulo n............... 118 5.3.2. Intersección de clases..................... 118 5.4. Visualizando y leyendo datos. Read y Show.............. 119 5.5. Las clases Num, Integral y Fractional de PRELUDE......... 122 5.5.1. Los tipos numéricos de HASKELL.............. 123 5.5.2. Ambigüedad en las constantes numéricas........... 125 5.5.3. Promoción numérica...................... 126 5.5.4. Ejemplo: los racionales como instancias genéricas...... 128 5.6. Ejercicios................................ 129 6. Programación con listas 131 6.1. El tipo lista................................ 131 6.1.1. Secuencias aritméticas. La clase Enum............ 132 6.2. Concatenación de listas......................... 134 6.3. Inducción sobre listas.......................... 136 6.4. Selectores................................ 137 6.5. Emparejando listas............................ 140 6.6. Aplicando una función a los elementos de una lista........... 141 6.7. Filtros.................................. 142 6.8. Listas por comprensión......................... 144 6.8.1. Semántica de listas por comprensión............. 147 6.9. Plegado de listas............................. 148 6.9.1. foldr.............................. 148 6.9.2. La propiedad universal de foldr................ 151 6.9.3. foldl.............................. 153 6.10. Ordenación de listas........................... 154 6.10.1. Ordenación por inserción................... 155 6.10.2. Ordenación por mezcla..................... 156 6.10.3. Ordenación rápida....................... 158 6.11. Problemas combinatorios........................ 159 6.11.1. Los segmentos iniciales de una lista.............. 159 6.11.2. Los segmentos consecutivos de una lista........... 160 6.11.3. Permutaciones de una lista................... 161 6.12. Otras funciones predefinidas....................... 162 6.13. Ejercicios................................ 164

VIII Índice general 7. Entrada y salida 169 7.1. Operaciones de entrada y salida..................... 169 7.1.1. El problema de la entrada y salida............... 169 7.1.2. El tipo IO........................... 170 7.1.3. Excepciones.......................... 172 7.2. Un formateador de textos........................ 174 7.2.1. Una implementación ineficiente................ 175 7.2.2. Una implementación eficiente................. 177 7.2.3. Utilidades para el manejo de documentos........... 179 7.2.4. Una clase de tipos documentables............... 179 7.2.5. Ejemplos............................ 180 II Programación avanzada 183 8. Evaluación perezosa. Redes de procesos 185 8.1. Evaluación perezosa........................... 185 8.1.1. Argumentos estrictos...................... 185 8.1.2. Procesando estructuras infinitas en forma perezosa...... 186 8.2. Listas parciales y listas infinitas..................... 189 8.2.1. Aproximaciones o listas parciales............... 189 8.2.2. Inducción sobre listas parciales................ 190 8.3. Redes finitas de procesos........................ 191 8.3.1. La criba de Eratóstenes.................... 193 8.3.2. El triángulo de Pascal..................... 195 8.3.3. Procesos con varias entradas.................. 196 8.3.4. La lista de factoriales...................... 196 8.3.5. Los números de Fibonacci................... 198 8.3.6. Sucesiones genéricas...................... 199 8.3.7. Los números de Hamming................... 202 8.4. Sucesiones contadoras.......................... 203 8.5. Ejercicios................................ 207 9. Programación con árboles y grafos 211 9.1. Árboles.................................. 211 9.2. 9.1.1. Funciones de orden superior sobre árboles.......... 213 Árboles binarios............................. 215 9.2.1. Árboles binarios de búsqueda................. 215 9.2.2. Funciones de orden superior para árboles binarios...... 219 9.2.3. Inducción para árboles binarios................ 220 9.3. Arrays.................................. 222 9.3.1. Una implementación ineficiente................ 222 9.3.2. Una implementación eficiente................. 224 9.4. Grafos y búsqueda en grafos....................... 226 9.4.1. Búsqueda en anchura y en profundidad............ 227 9.4.2. Los grafos como instancias de una clase uniparamétrica... 229

Índice general IX 9.5. Grafos con pesos............................. 232 9.5.1. Grafos con pesos como instancias de clases biparamétricas.. 232 9.5.2. Una clase HASKELL para grafos con pesos.......... 234 9.6. Ejercicios................................ 236 10. Programación modular y tipos abstractos de datos 243 10.1. Módulos................................. 243 10.2. Bibliotecas estandarizadas........................ 243 10.3. Declaraciones de módulos........................ 243 10.4. Importación............................... 245 10.4.1. Importación cualificada.................... 246 10.5. Tipos abstractos de datos........................ 247 10.6. Representación.............................. 247 10.6.1. Representación con una interfaz no sobrecargada....... 247 10.6.2. Representación con una interfaz sobrecargada......... 249 10.7. El TAD Conjunto (Conjunto)...................... 253 10.8. El TAD Lista Ordenada (OrdLista)................... 254 10.9. El TAD Diccionario (Diccionario)................... 255 10.10. Un índice KWIC (KeyWord In Context)................ 257 10.10.1. Datos del problema....................... 258 10.10.2. La función kwic........................ 259 10.10.3. Algunas funciones y sinónimos de tipos útiles........ 259 10.10.4. La función creanoclaves................... 261 10.10.5. Modelo de datos para la resolución.............. 261 10.10.6. La función kwic........................ 262 10.11. Ejercicios................................ 264 11. Programación con mónadas 265 11.1. Concepto de mónada........................... 265 11.2. Clases de constructores de tipos..................... 266 11.2.1. La clase Functor........................ 266 11.2.2. La clase Monad........................ 269 11.2.3. La clase MonadPlus...................... 272 11.3. Interpretación de las propiedades.................... 273 11.3.1. Interpretación del operador (>>=).............. 276 11.4. Relación entre funtor y mónada..................... 277 11.5. La notación do.............................. 280 11.6. Ejemplos de mónadas.......................... 283 11.6.1. La mónada identidad...................... 283 11.6.2. La mónada escritora...................... 284 11.6.3. La mónada lectora....................... 286 11.6.4. La mónada de transformadores de estado........... 288 11.6.5. La lista como mónada indeterminista............. 291 11.6.6. La mónada error........................ 292 11.7. Operaciones con mónadas........................ 296 11.7.1. Combinando mónadas..................... 297

X Índice general 11.7.2. Transformadores monádicos.................. 298 11.8. Ejercicios................................ 302 III Aplicaciones 303 12. Algoritmos numéricos programados funcionalmente 305 12.1. Introducción............................... 305 12.2. Búsqueda de puntos fijos........................ 305 12.3. Extrapolación por paso al límite..................... 308 12.4. Álgebra lineal numérica......................... 312 12.5. Series de potencias............................ 314 12.6. Ejercicios................................ 316 13. Puzzles y solitarios 319 13.1. Algunos problemas combinatorios................... 319 13.1.1. El producto máximo con un conjunto de dígitos........ 319 13.1.2. El problema de las vasijas................... 320 13.1.3. El problema de los caníbales y los misioneros......... 322 13.1.4. El solitario de Abreu...................... 324 13.2. La sopa de letras............................. 327 13.2.1. Un esbozo de la solución.................... 327 13.2.2. Buscando las apariciones de una palabra........... 329 13.2.3. Movimiento de matrices y lecturas de líneas......... 330 13.3. El problema de las ocho reinas..................... 333 13.3.1. Soluciones mediante listas por comprensión......... 333 13.3.2. Solución mediante búsqueda en grafos............ 336 13.3.3. Grafos acíclicos........................ 338 13.4. Programación funcional estilo PROLOG................. 339 13.5. Ejercicios................................ 342 14. Analizadores 345 14.1. Analizadores y la clase Read...................... 345 14.1.1. Gramáticas y la notación BNF................. 346 14.1.2. El tipo Read.......................... 347 14.1.3. La clase Read......................... 356 14.2. Analizadores monádicos......................... 357 14.2.1. Secuenciación......................... 358 14.2.2. Alternancia........................... 359 14.2.3. Filtros............................. 360 14.2.4. Iteración............................ 361 14.2.5. Elección parcial........................ 362 14.2.6. Un analizador para términos.................. 363 14.3. Ejercicios................................ 366

Índice general XI 15. Simulación 369 15.1. Generación de aleatorios por congruencias............... 369 15.1.1. Programando secuencias pseudo-aleatorias.......... 370 15.1.2. Algunos resultados teóricos.................. 373 15.2. Simulación en el juego del póquer.................... 374 15.2.1. Generando un mazo de cartas................. 374 15.2.2. Búsqueda de ciertas jugadas: parejas, tríos, etc......... 375 15.2.3. Contando todas las jugadas.................. 376 15.3. Obteniendo semillas y aleatorios a través del sistema.......... 379 15.3.1. Un modelo monádico para la simulación........... 380 15.4. El juego de la lotería primitiva...................... 383 15.4.1. Realizando escrutinios..................... 383 15.4.2. Generación de sorteos..................... 384 15.4.3. Estudio estadístico de ciertas combinaciones......... 385 15.4.4. Descripción monádica del juego de la primitiva........ 387 15.5. Simulación monádica de juegos con dados............... 388 15.5.1. Mezclando valores producidos por varias acciones...... 389 15.5.2. Plegando valores monádicos.................. 389 15.5.3. Repetición de varias tiradas con varios dados......... 391 15.5.4. Contabilizando jugadas.................... 392 IV Aspectos teóricos 395 16. Técnicas de programación y transformaciones de programas 397 16.1. Inducción estructural.......................... 397 16.2. Parámetros acumuladores........................ 405 16.2.1. Los números de Fibonacci................... 405 16.2.2. Cálculo del factorial de un natural............... 410 16.2.3. Plegados estrictos....................... 414 16.3. Transformación de programas. El modelo desplegar/plegar...... 417 16.3.1. Un ejemplo sencillo de transformación............ 417 16.3.2. Las reglas desplegar/plegar.................. 418 16.3.3. Reducción de la complejidad por transformación....... 420 16.3.4. Corrección parcial de los programas transformados...... 425 16.4. Programas a partir de especificaciones................. 425 16.4.1. Especificaciones ejecutables.................. 426 16.4.2. Especificaciones no ejecutables................ 426 16.4.3. Transformación de una especificación no ejecutable..... 427 16.5. Semántica denotacional de un lenguaje imperativo........... 430 16.5.1. Representación de entornos con tuplas............ 432 16.5.2. Representación de entornos con funciones.......... 434 16.5.3. El lenguaje imperativo de Dijkstra............... 437 16.5.4. Una semántica determinista para el lenguaje de Dijkstra... 439 16.5.5. Una semántica indeterminista para el lenguaje de Dijkstra.. 441 16.6. Ejercicios................................ 443

XII Índice general 17. Introducción al λ-cálculo 451 17.1. Sintaxis del lambda cálculo....................... 451 17.2. δ-reducción y β-reducción........................ 453 17.2.1. λ-teorías............................ 457 17.2.2. Eta-conversión y extensionalidad............... 459 17.2.3. Reducción generada por un programa............. 460 17.3. Formas normales. Teoremas de Church-Rosser............. 461 17.4. Órdenes de reducción. Teorema de estandarización........... 465 17.5. Lambda definibilidad.......................... 468 17.5.1. Operaciones lógicas...................... 469 17.5.2. Computabilidad........................ 469 17.5.3. Puntos fijos y recursión.................... 471 17.5.4. Listas en el λc......................... 473 17.6. Los sistemas de tipos de Church y de Curry............... 474 17.6.1. Propiedades del sistema λ Curry............... 475 17.6.2. La correspondencia de Howard-Curry-de Bruijn....... 478 17.7. Ejemplos prácticos de inferencia de tipos................ 478 17.7.1. Caso de un único argumento.................. 479 17.7.2. Caso de varios argumentos................... 480 17.7.3. Caso en que aparecen otras variables predefinidas...... 482 17.8. Inferencia de tipos en presencia de recursión.............. 484 17.9. Inferencia de tipos en presencia de patrones.............. 487 17.10. Reglas elementales para inferencia de tipos............... 490 17.11. El λ-cálculo polimórfico......................... 492 17.11.1. Inferencia de tipos en presencia de polimorfismo....... 494 17.11.2. Un teorema de parametricidad para funciones polimórficas.. 496 Bibliografía 499 Índice alfabético 503

ÍNDICE DE FIGURAS 1.1. Representación perezosa de la función doble.............. 10 1.2. Reducción perezosa de doble (doble 3)................. 10 2.1. Asociatividad y prioridad de los operadores predefinidos........ 26 2.2. Sangrando una declaración....................... 44 2.3. Sangrando dos declaraciones...................... 44 3.1. Aplicaciones parciales.......................... 52 3.2. La función unavez........................... 61 3.3. La función dosveces.......................... 62 3.4. La composición de funciones...................... 63 4.1. Cálculo de espar usando foldnat................... 86 5.1. Jerarquía de clases de PRELUDE.................... 108 5.2. Instancias HASKELL estandarizadas para los tipos de PRELUDE.... 109 5.3. La clase Ord............................... 116 6.1. La clase Enum............................. 132 6.2. head, tail, init y last.......................... 138 6.3. take, drop y (!!)............................. 139 6.4. Reducción de foldr f z [x 1,..., x n 1, x n ].............. 150 6.5. Reducción de foldr1 f [x 1,..., x n 1, x n ]............... 151 6.6. Reducción de foldl f z [x 1,..., x n 1, x n ]............... 153 6.7. Ordenación por mezcla......................... 157 6.8. Ordenación rápida............................ 158 7.1. Diálogos con pretty printer....................... 181 7.2. Diálogos con pretty printer....................... 181 8.1. La función incr............................. 192 8.2. Red para la evaluación de los enteros positivos............. 192 8.3. Red de procesos para sucesiones.................... 193 8.4. Red de procesos para la criba de Eratóstenes.............. 195 8.5. Red para el triángulo de Pascal..................... 196 8.6. Red de procesos para la lista de factoriales............... 197 8.7. Red para el cómputo de los números de Fibonacci........... 199

XIV Índice de figuras 8.8. Red para el cálculo de la sucesión xn.................. 201 8.9. Red para el cómputo de los números de Hamming........... 202 8.10. Red de procesos para los pares de naturales............... 208 9.1. Un árbol con 7 elementos........................ 211 9.2. Un árbol ordenado............................ 216 9.3. Eliminación de un dato......................... 217 9.4. Árbol para creaarray [0..7]....................... 225 9.5. Un grafo................................. 227 9.6. Otro grafo................................ 227 9.7. Árbol de visitas en profundidad..................... 228 9.8. Árbol de visitas en anchura....................... 228 9.9. Un grafo sencillo............................. 231 9.10. Un grafo con pesos........................... 235 9.11. Un diccionario.............................. 238 10.1. Cabecera del módulo Conjunto..................... 253 11.1. Definición de (>>=).......................... 266 11.2. Propiedad (m1)............................. 273 11.3. Propiedad (m2)............................. 273 11.4. Propiedad (k1).............................. 274 11.5. Propiedad (k2).............................. 274 11.6. Propiedad (k3). Primera función.................... 275 11.7. Propiedad (k3). Segunda función.................... 276 11.8. Cómputos con (>>=).......................... 277 11.9. Cómputos con (>>=) gráficamente.................. 277 11.10. Definición de fmap a través de una mónada.............. 278 11.11. Definición de join a partir de una mónada............... 278 11.12. Definición de (>>=) a partir de join y fmap............. 279 11.13. El operador (>>=) de la mónada Lectora............... 287 11.14. Un transformador de estados...................... 289 11.15. (>>=) para transformadores de estados................ 289 12.1. Cálculo de la raíz n-ésima por el método de Newton-Raphson..... 307 12.2. Traspuesta de una matriz........................ 313 13.1. El problema de las vasijas........................ 321 13.2. El problema de los caníbales y misioneros............... 323 13.3. Tablero de cuatro filas para el solitario de Abreu. Un movimiento... 325 13.4. Posición inicial y final del ocho-puzzle. Un movimiento........ 326 13.5. Direcciones en la lectura......................... 331 13.6. Reconstrucción de las diagonales.................... 332 13.7. noataca 2 [5, 1, 4] = True...................... 334 13.8. noataca 3 [5, 1, 4] = False...................... 334 13.9. Dos reinas que se atacan......................... 335 13.10. El problema de las ocho reinas..................... 337

Índice de figuras XV 13.11. Las torres de Hanoi........................... 338 13.12. El problema de las Torres de Hanoi con cuatro torres.......... 339 13.13. El tablero del solitario.......................... 339 13.14. Un cuadrado mágico........................... 340 13.15. El problema de los tres sombreros.................... 340 13.16. Los cuatro caballos........................... 342 13.17. El problema de los trenes........................ 343 13.18. Un polígono............................... 343 13.19. La vía.................................. 343 17.1. Algunos términos notables....................... 468 17.2. El sistema de tipos de Curry....................... 475 17.3. El λ-cálculo polimórfico......................... 493