Programación Funcional

Documentos relacionados
data Tree a = Tip Node a (Tree a) (Tree a) deriving Show

Tema 6: Funciones recursivas

Tema 11. Listas infinitas

Programación Funcional en Haskell

Tema 4: Definición de funciones

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

Introducción. Haskell

Tema 5: Definiciones de listas por comprensión

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Tema 3: Tipos y clases

EJERCICIOS DE LENGUAJES Y PARADIGMAS DE PROGRAMACIÓN (CUESTIONES DE EXAMEN) PROGRAMACIÓN FUNCIONAL

Tema 9: Declaraciones de tipos y clases

Tema 13: Aplicaciones de programación funcional

Guía 1: Funciones, precedencia y tipado

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

Programación Funcional Haskell Clase 21

El sistema de clases de Haskell. Introducción

Tema 9: Declaraciones de tipos y clases

Polinomios. Taller de Álgebra I. Verano 2017

Ejercicios de programación funcional con Haskell

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

Tipos paramétricos y recursivos

Tipos de datos algebraicos

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

SOLUCIONES A EJERCICIOS

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

Temas de Programación declarativa ( ) José A. Alonso Jiménez

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

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

Tema 7. El sistema de clases

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

Isabelle como un lenguaje funcional

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

Secuencias. Mauro Jaskelioff 18/05/2015

Programación Declarativa UNIVERSIDAD DE MÁLAGA

Tema 12: Programas interactivos

4.7 Operaciones sobre Objetos en Scheme

Matemáticas B 4º E.S.O. Polinomios y fracciones algebraicas. 1. x 5x 2 6 5

Lógica y Programación

Introducción a los Algoritmos Validez, Satisfactibilidad, Tipos y Funciones

Potencias de exponente entero I

Árboles balanceados (AVL) Tablas de dispersión (Hash) Colas de prioridad (Heap)

Rancagua, Agosto 2009

FACULTADE DE INFORMÁTICA Departamento de Computación Estructura de Datos e da Información. Ejercicios de recursividad

Operaciones de números racionales

Secuencias en Python. Introducción a la Computación Clase 11 Patricia Borensztejn

ÁLGEBRAS DE BOOLE. Ejemplos 1) Si S es un conjunto, entonces ( (S),, ) es álgebra de Boole. A B = A B A B = A B

Tema 3. Patrones y Definiciones de Funciones

Una matriz es un arreglo rectangular de números. Los números en el arreglo se llaman elementos de la matriz. ) ( + ( ) ( )

TRABAJO DE MATEMÁTICAS. PENDIENTES DE 2º E.S.O. (1ª parte)

Tipos Abstractos de Datos

Tema 13: Programas interactivos

Aritmética entera. AMD Grado en Ingeniería Informática. AMD Grado en Ingeniería Informática (UM) Aritmética entera 1 / 15

Capítulo 4 Procesos con estructuras de repetición

MATEMÁTICA LIC. Y PROF. EN CS. BIOLÓGICAS

GUÍA BÁSICA DE SCHEME v.4

Paradigmas de Programación

CURSO BÁSICO DE MATEMÁTICAS PARA ESTUDIANTES DE ECONÓMICAS Y EMPRESARIALES. Unidad didáctica 7. Funciones reales de variable real CONCEPTOS BÁSICOS

Tesis de Maestría en Informática

Cursada Segundo Cuatrimestre 2012 Guía de Trabajos Prácticos Nro. 1

EJEMPLO DE PREGU,TAS

RESUMEN DE CONCEPTOS

Proyecto Clases de Tipos: Polinomios

Forma polar de números complejos (repaso breve)

Fracciones numéricas enteras

Métodos de la clase String

ESTRUCTURA Y TECNOLOGÍA DE LOS COMPUTADORES I. TEMA 4 Algebra booleana y puertas lógicas

Estructuras de Datos. Dr. Pablo E. Fidel Martínez López Lic. en Ciencias de la Computación UNR

001. Interpreta correctamente códigos (teléfonos, matrículas, NIF ).

Introducción a Haskell. El lenguaje Haskell

ESCUELA PREPARATORIA OFICIAL NO.16 MATERÍA: PENSAMIENTO NUMÉRICO Y ALGEBRAICO I

Tema 04:Fracciones. Primero de Educación Secundaria Obligatoria. I.e.s Fuentesaúco.

TEMA 2 POLINOMIOS Y FRACCIONES ALGEBRAICAS

= 310 (1 + 5) : 2 2 = = = 12 ( 3) ( 5) = = 2 = ( 4) + ( 20) + 3 = = 21

Factorización - Álgebra

Anexo. Aplicaciones de los Determinantes

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

RESUMEN DE CONCEPTOS TEÓRICOS MATEMÁTICAS 1º ESO. CURSO

MATEMÁTICAS 2º ESO. TEMA 1

Trabajo Práctico 5 Estructura Repetitiva

Problemas de Recursividad

Llamamos potencia a todo producto de factores iguales. Por ejemplo: 3 4 =

FRACCIONES. Una fracción tiene dos términos, numerador y denominador, separados por una raya horizontal.

Carlos A. Rivera-Morales. Precálculo 2

Divisibilidad I. Nombre Curso Fecha

int int. 1622

UNIDAD: NÚMEROS Y PROPORCIONALIDAD NÚMEROS ENTEROS

TEMA 2. Números racionales. Teoría. Matemáticas

Teoría de Conjuntos y Conjuntos Numéricos

Programación I. Ingeniería Técnica Informática. Ejercicios de los Temas 4, 5, 6 y 7

Series numéricas y de potencias. 24 de Noviembre de 2014

4.2 Números primos grandes. MATE 3041 Profa. Milena R. Salcedo Villanueva

FISICA I Repaso. Si el alumno no supera al maestro, ni es bueno el alumno; ni es bueno el maestro (Proverbio Chino)

Complejidad computacional. Algoritmos y Estructuras de Datos I. Complejidad computacional. Notación O grande

CURSO BÁSICO DE MATEMÁTICAS PARA ESTUDIANTES DE ECONÓMICAS Y EMPRESARIALES. Unidad didáctica 4. Números reales y números complejos

Abstracción de Datos y

Conjuntos Numéricos I

Números reales Conceptos básicos Conjuntos numéricos

Definición 1. Dado un conjunto C una aplicación definida por : C C C

Transcripción:

Alberto Pardo Marcos Viera Instituto de Computación, Facultad de Ingeniería Universidad de la República, Uruguay

Operaciones sobre listas

Listas El tipo de las listas es uno de los más usados en PF Su relevancia en PF se compara a la de los conjuntos en la matemática La expresión [m.. n] denota la lista de valores entre m y n. Si m > n denota la lista vacía [ ]. Por ejemplo, [1.. 4] denota la lista [1, 2, 3, 4].

Divisores de un número Ser divisor: m divide n = n mod m == 0

Divisores de un número Ser divisor: m divide n = n mod m == 0 Divisores de un entero positivo (incluyéndolo):

Divisores de un número Ser divisor: m divide n = n mod m == 0 Divisores de un entero positivo (incluyéndolo): divisores n = [d d [1.. n], d divide n]

Divisores de un número Ser divisor: m divide n = n mod m == 0 Divisores de un entero positivo (incluyéndolo): divisores n = [d d [1.. n], d divide n] equivale a divisores n = filter ( divide n) [1.. n]

Divisores de un número Ser divisor: m divide n = n mod m == 0 Divisores de un entero positivo (incluyéndolo): divisores n = [d d [1.. n], d divide n] equivale a divisores n = filter ( divide n) [1.. n] Máximo común divisor:

Divisores de un número Ser divisor: m divide n = n mod m == 0 Divisores de un entero positivo (incluyéndolo): divisores n = [d d [1.. n], d divide n] equivale a divisores n = filter ( divide n) [1.. n] Máximo común divisor: mcd x y = maximum [d d divisores x, d divide y ]

Divisores de un número Ser divisor: m divide n = n mod m == 0 Divisores de un entero positivo (incluyéndolo): divisores n = [d d [1.. n], d divide n] equivale a divisores n = filter ( divide n) [1.. n] Máximo común divisor: mcd x y = maximum [d d divisores x, d divide y ] equivale a mcd x y = maximum filter ( divide y) divisores $ x donde f $ x = f x

Números primos Determinar si un número es primo:

Números primos Determinar si un número es primo: primo n = divisores n == [1, n]

Números primos Determinar si un número es primo: primo n = divisores n == [1, n] Esto se puede hacer de forma mas eficiente:

Números primos Determinar si un número es primo: primo n = divisores n == [1, n] Esto se puede hacer de forma mas eficiente: primo n = (n > 1) && ([d d [2.. intsqrt n], d divide n] == [ ]) intsqrt n es el mayor entero cuyo cuadrado es menor o igual a n, o sea, n

Números perfectos Factores de un número (divisores menores que el número): factores n = filter ( divide n) [1.. n div 2]

Números perfectos Factores de un número (divisores menores que el número): factores n = filter ( divide n) [1.. n div 2] Se dice que un número es perfecto si la suma de sus factores es igual al número: perfecto n = sum (factores n) == n

Números perfectos Factores de un número (divisores menores que el número): factores n = filter ( divide n) [1.. n div 2] Se dice que un número es perfecto si la suma de sus factores es igual al número: perfecto n = sum (factores n) == n Números perfectos entre 1 y 100: >filter perfecto [1.. 100]

Números perfectos Factores de un número (divisores menores que el número): factores n = filter ( divide n) [1.. n div 2] Se dice que un número es perfecto si la suma de sus factores es igual al número: perfecto n = sum (factores n) == n Números perfectos entre 1 y 100: >filter perfecto [1.. 100] [6, 28]

take y drop Dado un entero no negativo n y una lista xs: take n xs retorna el segmento inicial de xs de largo n si su largo es menor que n retorna toda xs drop n xs retorna la lista luego de sacar los primeros n elementos de xs si su largo es menor que n retorna la lista vacía take y drop satisfacen que: take n xs + drop n xs == xs

Ejemplos Retornar una lista menos su último elemento. init :: [a] [a] init xs = take (length xs 1) xs

Ejemplos Retornar una lista menos su último elemento. init :: [a] [a] init xs = take (length xs 1) xs Último elemento de una lista. last :: [a] a last xs = head $ drop (length xs 1) xs

Ejemplos Retornar una lista menos su último elemento. init :: [a] [a] init xs = take (length xs 1) xs Último elemento de una lista. last :: [a] a last xs = head $ drop (length xs 1) xs Partir una lista en dos en un determinado lugar. splitat :: Int [a] ([a], [a]) splitat n xs = (take n xs, drop n xs)

trail La función trail es un ejemplo de diseño composicional. La llamada trail n retorna las últimas n ĺıneas de un texto. trail :: Int String String trail n = unlines reverse take n reverse lines La función lines separa un texto en ĺıneas; unlines es su inversa. lines :: String [String ] unlines :: [String ] String

La función zip zip :: [a] [b] [(a, b)

La función zip zip :: [a] [b] [(a, b) Producto escalar de dos vectores (dados como listas):

La función zip zip :: [a] [b] [(a, b) Producto escalar de dos vectores (dados como listas): prodesc :: Num a [a] [a] a prodesc xs ys = sum map (uncurry ( )) $ zip xs ys

La función zip zip :: [a] [b] [(a, b) Producto escalar de dos vectores (dados como listas): prodesc :: Num a [a] [a] a prodesc xs ys = sum map (uncurry ( )) $ zip xs ys Determinar si una secuencia es no decreciente:

La función zip zip :: [a] [b] [(a, b) Producto escalar de dos vectores (dados como listas): prodesc :: Num a [a] [a] a prodesc xs ys = sum map (uncurry ( )) $ zip xs ys Determinar si una secuencia es no decreciente: nondec :: Ord a [a] Bool nondec xs = and map (uncurry ( )) $ zip xs (tail xs) donde and bs es True si todos los elementos de la lista (de booleanos) bs son True.

La función zipwith zipwith :: (a b c) [a] [b] [c ] zipwith f = map (uncurry f ) (zip xs ys)

La función zipwith zipwith :: (a b c) [a] [b] [c ] zipwith f = map (uncurry f ) (zip xs ys) Usando zipwith podemos definir prodesc y nondec: prodesc xs ys = sum $ zipwith ( ) xs ys nondec xs = and $ zipwith ( ) xs (tail xs)

La función foldr foldr :: (a b b) b [a] b Dada un operador y un valor e, la función foldr ( ) e cuando es aplicada a una lista [x 1,..., x n ], es decir, x 1 : x 2 : x 3 :... : x n : [ ], o que es lo mismo, x 1 : (x 2 : (x 3 :... : (x n : [ ])...)) retorna el valor x 1 (x 2 (x 3...(x n e)...)) En otras palabras, foldr sustituye (:) por ( ) y [ ] por e.

Ejemplos sum :: Num a [a] a sum = foldr (+) 0 and :: [Bool ] Bool and = foldr (&&) True map :: (a b) [a] [b] map f = foldr (cons f ) [ ] where cons x xs = x : xs filter :: (a Bool) [a] [a] filter p = foldr op [ ] where op a r p a = a : r otherwise = r