Tema 4. Funciones de orden superior

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 3. Patrones y Definiciones de Funciones

Tema 3. Patrones y Definiciones de Funciones

Tema 2. Tipos predefinidos

Tema 6. Definiciones de tipos

Introducción a Haskell. El lenguaje Haskell

Tema 7. El sistema de clases

El lenguaje C. 1. Identificadores, constantes y variables

Tema 4: Definición de funciones

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

Tema 4: Definición de funciones

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

Tema 4.- Recursión e iteración

Carlos A. Rivera-Morales. Precálculo 2

Tema II: Introducción al Lenguaje Funcional

Funciones de Plegado sobre listas

Tema 6: Funciones recursivas

Informática Ingeniería en Electrónica y Automática Industrial

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)

Guía 2: Listas, recursión e inducción

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

Informática Aplicada I

Programación funcional

Contenido del curso Fundamentos de Lenguajes de Programación

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

Laboratorio de Arquitectura de Redes. Operadores y expresiones en lenguaje C

Tema 3: Tipos y clases

Tema 3: Tipos y clases

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

Tema 3: Tipos y clases

Introducción al Lambda Cálculo (C)

Tema 3: Tipos y clases

Lenguajes de Programación Programación funcional

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

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Práctica de constantes, expresiones y operadores. Programación en C 1

Definiciones de tipo. Sinónimos de tipo

Introducción a Haskell. Cecilia Manzino

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

Programación Declarativa UNIVERSIDAD DE MÁLAGA

Lambda-Cálculo. Mauro Jaskelioff 6/9/2011

Álgebra Lineal y Estructuras Matemáticas. J. C. Rosales y P. A. García Sánchez. Departamento de Álgebra, Universidad de Granada

Entendiendo expresiones lambda en C# con Mono

Inteligencia Artificial: Prolog

Conjuntos, relaciones de equivalencia y aplicaciones

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

Tema Árboles generales. 9.2 Árboles binarios 9.3 Árboles de búsqueda

Informática PRÀCTICA 3 Curs Práctica Nº 3: Tipos de datos simples. Constantes y variables. Operadores aritméticos. Formato de salida.

Capítulo VI. Diferenciabilidad de funciones de varias variables

Ejercicios de Álgebra Básica. Curso 2017/18

Expresiones regulares

Tipos de datos algebraicos

Compuertas Lógicas, Algebra Booleana

Formas canónicas de Jordan

Guía 2: Funciones, listas, recursión e inducción

UNIDAD 8: SUCESIONES Y SERIES

Tema 11. Listas infinitas

Ejercicios de Álgebra Básica. Curso 2014/15

UNIDAD 1. Números naturales y enteros 1º ESO. Contenidos, objetivos y criterios de evaluación DEPARTAMENTO DE MATEMÁTICAS

Programación Declarativa

Guardas y Tipos de datos

Guía práctica de estudio 06: Lenguaje binario

Aritmética en Haskell

Tema 2.- Expresiones y funciones

Axiomas del Cálculo de Predicados

Carlos A. Rivera-Morales. Precálculo 2

SISTEMAS DE NUMERACIÓN

Programación Funcional Lisp-Scheme

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

Mathematica como lenguaje de programación

1. MANEJO DE SUMATORIOS. PROPIEDADES Y EJERCICIOS.

Funciones como parámetros, funciones como resultados. Introducción a la Computación Patricia Borensztejn Clase 26

Tipos paramétricos y recursivos

Práctica 1. Continuidad Ejercicios resueltos

Facultad de Ciencias de la Computación. Cálculo Lambda Reducción β Transformación:Gelfond-Lifchitz. Dr. Fernando Zacarías Flores

Programación Funcional Haskell Clase 19

GUÍA BÁSICA DE SCHEME v.4

Universidad autónoma de Guerrero Unidad Académica de Ingeniería. Eric Rodríguez Peralta. Sistemas numéricos

Creación de fórmulas. Contenido

Objetivos de la sesión. Expresiones aritméticas. Operadores Aritméticos 12/30/11

EVALUACIÓN DE CONTENIDOS

Elementos de un lenguaje de programación. Lenguajes de Programación 1

MATEMÁTICAS BÁSICAS UNIVERSIDAD NACIONAL DE COLOMBIA - SEDE MEDELLÍN CLASE #22. = x 2 :

Estructuras Algebraicas

Análisis Matemático IV

Guía práctica de estudio 06: Lenguaje binario

LAS MATEMÁTICAS Y SU LENGUAJE. Entender, demostrar y resolver matemáticas

VALORES MÁXIMOS Y MÍNIMOS DE FUNCIONES DE DOS VARIABLES

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional

Capítulo 2: Asistentes de Pruebas para Programadores 3. Cálculo de Construcciones

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

Introducción a la Lógica

4. Operadores Operador asignación

Lógica y Programación

Introducción al Cálculo Lambda

PARADIGMAS DE PROGRAMACIÓN CALCULO LAMBDA CALCULO LAMBDA

Guía 1: Funciones, precedencia y tipado

06 Análisis léxico II

Tema 7: Razonamiento sobre programas

Transcripción:

Programación Declarativa Haskell Informática Sistemas Curso 2003-2004 Pepe Gallardo Universidad de Málaga Tema 4. Funciones de orden superior 4.1 Funciones de orden superior 4.2 Expresiones lambda 4.3 Aplicación parcial Secciones 4.4 Ejemplo: una función de orden superior para enteros

4.1 Funciones de orden superior Una función tal que alguno de sus argumentos es una función o que devuelve una función como resultado. Son útiles porque permiten capturar esquemas de cómputo generales (abstracción). Ejemplo: dosv eces :: () dosveces f x = f (f x ) inc :: inc x = x + 1 dec :: dec x = x + 1 El primer argumento de dosveces debe ser una función con tipo. Los paréntesis en el tipo de dosveces son obligatorios. Uso? dosveces inc 10 12 : : eger? dosveces dec 10 8 : : eger Informática Pepe Gallardo Universidad de Málaga 4.1

4.2 Expresiones lambda Permiten definir funciones anónimas (sin nombre). Ejemplo: λ x x + 1 denota en Haskell la función que toma un argumento (x) y lo devuelve incrementado.? λ x x + 1 function ::? (λ x x + 1) 10 11 : : eger Paso a paso: (λ x x + 1) 10 ===> {Sustitutyendo el argumento x por 10} 10 + 1 ===> {por (+)} 11 Funciones de más de un argumento con la notación lambda:? (λ x y x + y) function :: eger? (λ x y x + y) 5 7 12 : : eger Son útiles como argumentos de funciones de orden superior:? dosveces (λ x x + 1) 10 12 : : eger? dosveces (λ x x 1) 10 8 : : eger? dosveces (λ x x 2) 10 40 : : eger Informática Pepe Gallardo Universidad de Málaga 4.2

4.3 Aplicación parcial Permite aplicar a una función menos argumentos de los que tiene para obtener una nueva función Aplicación parcial o parcialización: Si f es una función de n argumentos y se le aplican k n argumentos con los tipos adecuados, se obtiene como resultado una nueva función que espera los n k argumentos restantes. Regla de la cancelación si f :: t 1 t 2... t n t r y e 1 :: t 1, e 2 :: t 2..., e k :: t k con (k n) entonces f e 1 e 2... e k :: t k+1 t k+2... t n t r Ejemplo: A la siguiente función de tres argumentos: fun x y z = x (2 y + z ) es posible aplicarle uno, dos o tres argumentos. En cada caso obtenemos una función con un argumento menos. x :: y :: z :: x*(2*y+z) y :: z :: 5*(2*y+z) fun fun 5 z :: 5*(2*6+z) 5*(2*6+7) fun 5 6 fun 5 6 7 Informática Pepe Gallardo Universidad de Málaga 4.3

Aplicación parcial (2) Todo esto funciona gracias a los siguientes convenios Definiciones de funciones fx 1 x 2... x n = e ===> f = λx 1 x 2... x n e λx 1 x 2... x n e ===> Regla de λ-abstracciones λx 1 (λx 2 (... (λx n e))) Asociatividad a la derecha de ( ) (En Tipos) t 1 t 2... t n ===> (t 1 (t 2 (... t n ))) Asociatividad izquierda de la aplicación de funciones fa 1 a 2... a n ===> (((f a 1 ) a 2 )... a n ) Consideremos la función anterior: fun x y z = x (2 y + z ) Por las reglas anteriores la definición es equivalente a: ( ( )) fun = λ x (λ y (λ z x (2 y + z ))) Informática Pepe Gallardo Universidad de Málaga 4.4

Aplicación parcial (3) ( ( )) fun = λ x (λ y (λ z x (2 y + z ))) Así, fun 5 ===> {por definición de fun} λ x (λ y (λ z x (2 y + z))) 5 ===> {sustituyendo x por 5} λ y (λ z 5 (2 y + z )) ===> {regla de las λ-abstracciones} λ y z 5 (2 y + z ) que tiene tipo También, fun 5 6 ===> {asociatividad izq de aplicación} (fun 5) 6 ===> {por reducción anterior} (λ y (λ z 5 (2 y + z))) 6 ===> {sustituyendo y por 6} λ z 5 (2 6 + z ) que tiene tipo Por último, fun 5 6 7 ===> ((fun 5) 6) 7 ===> {por reducción anterior} (λ z 5 (2 6 + z )) 7 ===> {sustituyendo z por 7} 5 (2 6 + 7) ===> {por aritmética} 95 {asociatividad izq de aplicación} Informática Pepe Gallardo Universidad de Málaga 4.5

Secciones Los operadores pueden ser aplicados parcialmente Se obtienen funciones de un argumento Si ( ) es un operador tenemos las siguientes equivalencias (los paréntesis son obligatorios): Secciones de operadores (x ) ===> λ y x y ( y) ===> λ x x y ( ) ===> λ x y x y Ejemplos: (2.0/) Toma un valor real x y devuelve 2.0/x. (/2.0) Toma un valor real x y devuelve x /2.0. (/) Toma dos valores reales y devuelve su cociente. (> 2) Toma un argumento y devuelve True si es mayor que 2. (2 >) Toma un argumento y devuelve True si es menor que 2.? (/2.0) 8.0 4.0 :: Double? dosveces (+1) 10 12 : : eger Excepción: ( e) donde e es una expresión NO es una sección Informática Pepe Gallardo Universidad de Málaga 4.6

4.4 Ejemplo: una función de orden superior para enteros Muchas funciones sobre enteros siguen el siguiente esquema: Caso base: cuando el argumento es 0 Paso recursivo: se calcula el resultado para n + 1 a partir del resultado para n Ejemplos: factorial :: factorial 0 = 1 factorial m@(n + 1) = ( ) m (factorial n) sumatorio :: sumatorio 0 = 0 sumatorio m@(n + 1) = (+) m (sumatorio n) Ambas siguen el esquema: fun 0 = e fun m@(n + 1) = f m (fun n) Función de orden superior que lo captura: iter :: ( eger) eger () iter f e = fun where fun 0 = e fun m@(n + 1) = f m (fun n) Ahora es posible una definición más compacta: factorial :: factorial = iter ( ) 1 sumatorio :: sumatorio = iter (+) 0 Informática Pepe Gallardo Universidad de Málaga 4.7

Objetivos del tema El alumno debe: Conocer el concepto de función de orden superior Saber definir y utilizar funciones de orden superior Saber utilizar lambda expresiones Conocer el concepto de aplicación parcial y los convenios que hacen que tenga sentido Saber construir nuevas funciones aplicando parcialmente otras Conocer el tipo y el significado de una expresión construída mediante una aplicación parcial Entender que es posible capturar un patrón de cómputo habitual mediante una función de orden superior (abstracción) y cómo definir casos concretos de dicho patrón (concreción) Informática Pepe Gallardo Universidad de Málaga 4.8