Tema 4. Funciones de orden superior

Documentos relacionados
Tema 4. Funciones de orden superior

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

Informática de 1 o de Matemáticas. Ejercicios de Introducción a Haskell. Ejercicio 1 Consideremos la siguiente definición:

Tema 3. Patrones y Definiciones de Funciones

Tema 2. Tipos predefinidos

Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga. Temario

Introducción a Haskell. El lenguaje Haskell

Tema II: Introducción al Lenguaje Funcional

Lenguajes funcionales: λ-cálculo

Tema 7. El sistema de clases

Funciones de Plegado sobre listas

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)

Tema 6. Definiciones de tipos

Tema 4: Definición de funciones

Carlos A. Rivera-Morales. Precálculo 2

Tema 2: Introducción a Haskell

Tema 6: Funciones recursivas

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Introducción a Haskell. Cecilia Manzino

Laboratorio de Lenguajes de Programación Introducción al lenguaje ML

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

Definiciones de tipo. Sinónimos de tipo

Tema 4: Definición de funciones

Tema 8: Funciones de orden superior

Tema 8: Funciones de orden superior

Tema 3: Tipos y clases

Tema 3: Tipos y clases

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

Laboratorio Análisis Lógico Práctica 2: Tipos de datos en Haskell

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

El lenguaje C. 1. Identificadores, constantes y variables

Guardas y Tipos de datos

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

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

Algoritmos y programas. Algoritmos y Estructuras de Datos I

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

Tutorial Haskell David Julián Guzmán Cárdenas Cristian Alexanther Rojas Cárdenas Luis Ernesto Gil Castellanos

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga

Definiciones generales. Alfabeto de la lógica proposicional. Conectivos. Conectivos

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

EVALUACIÓN DE CONTENIDOS

Funciones Segunda parte

Tipos paramétricos y recursivos

Para entender la recursividad primero tenemos que entender la recursividad

Introducción a la programación. Cecilia Manzino

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

Tipos de datos y clases de tipos

Entendiendo expresiones lambda en C# con Mono

Programación funcional

Tipos en Haskell. Cecilia Manzino

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

Programación Funcional Haskell Clase 19

El sistema de clases de Haskell. Introducción

Aritmética en Haskell

int int. 1622

Capítulo VI. Diferenciabilidad de funciones de varias variables

Laboratorio Análisis Lógico Práctica 1

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

Isabelle como un lenguaje funcional

Manos a la obra: Recursión, división y listas

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

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

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

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

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

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

Abstracción de procedimientos

Tema 4.- Recursión e iteración

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

Un calculadora avanzada... y algo más!

Divisibilidad y congruencia

Cálculo Lambda Lenguajes Aplicativos puros Un Lenguaje Aplicativo con referencias y asignación Lenguajes y Compiladores

Introducción al Lambda Cálculo (C)

Contenido del curso Fundamentos de Lenguajes de Programación

Fundamentos de Informática 5. Operadores, expresiones (y su aplicación)

Introducción a OCaml. October 19, 2015

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

Tema 11. Listas infinitas

Matemáticas Empresariales II. Continuidad y Derivabilidad

Programación Funcional

Programación Funcional Haskell Clase 22

Programación Declarativa UNIVERSIDAD DE MÁLAGA

Conjuntos, relaciones de equivalencia y aplicaciones

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

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

Programación 2. Lección 3. Introducción a la recursividad

UNIDAD 8: SUCESIONES Y SERIES

Programación Funcional Haskell Clase 21

Lenguajes de Programación Programación funcional

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

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

06 Análisis léxico II

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

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

Transcripción:

Informática Haskell Matemáticas Curso 2004-2005 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). Son más útiles que las funciones normales (parte del comportamiento se especifica al usarlas). 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 : : Integer? dosveces dec 10 8 : : Integer 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 : : Integer 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 : Integer? (λ x y x + y) 5 7 12 : : Integer Son útiles como argumentos de funciones de orden superior:? dosveces (λ x x + 1) 10 12 : : Integer? dosveces (λ x x 1) 10 8 : : Integer? dosveces (λ x x 2) 10 40 : : Integer 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: Int Int Int Int 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 : Int y : Int z : Int x*(2*y+z) Int y : Int z : Int 5*(2*y+z) Int fun fun 5 z : Int 5*(2*6+z) Int 5*(2*6+7) Int 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 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: Int Int Int Int fun x y z = x (2 y + z ) Por las reglas anteriores la definición es equivalente a: Int (Int (Int Int)) fun x y z = x (2 y + z ) La expresión fun 5 tiene tipo Int (Int Int) La expresión fun 5 6 es equivalente a (fun 5) 6 y tiene tipo Int Int La expresión fun 5 6 7 es equivalente a ((fun 5) 6) 7 y tiene tipo Int Informática Pepe Gallardo Universidad de Málaga 4.4

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 : : Integer Excepción: ( e) donde e es una expresión NO es una sección Informática Pepe Gallardo Universidad de Málaga 4.5

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 :: ( Integer) Integer () 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.6

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.7