Tipos paramétricos y recursivos

Documentos relacionados
Tipos de datos algebraicos

Pattern matching + Tipos enumerados

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

Tipos de datos y clases de tipos

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

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

Divisibilidad y congruencia

Divisibilidad y congruencia

Para entender la recursividad primero tenemos que entender la recursividad

Números primos en Haskell

Guardas y Tipos de datos

Introducción a Haskell. Cecilia Manzino

Programación Funcional Haskell Clase 21

Tema 7. El sistema de clases

El sistema de clases de Haskell. Introducción

Polinomios. Taller de Álgebra I. Verano 2017

Tipos de datos en Haskell

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

Tema 9: Declaraciones de tipos y clases

Tema 3. Patrones y Definiciones de Funciones

Tema 3: Tipos y clases

Tema 3: Tipos y clases

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

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

Tema 3: Tipos y clases

Tema 9: Declaraciones de tipos y clases

Tema 3: Tipos y clases

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)

ALPII Práctica 3. Bernardo García Fuentes

PROBLEMAS RESUELTOS SELECTIVIDAD ANDALUCÍA 2016 MATEMÁTICAS II TEMA 3: ESPACIO AFIN Y EUCLIDEO

Mecanismo de Reducción

Tema 3. Patrones y Definiciones de Funciones

Tema 6. Definiciones de tipos

Introducción a los Algoritmos Tipos, Funciones y Patrones

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

Proyecto 2. Derivaciones y Tipos de datos en Haskell. Algoritmos y Estructuras de Datos I. 6 de septiembre de 2011

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

Programación Funcional Haskell Clase 22

Práctica N o 1 - Programación Funcional

Tema 6: Funciones recursivas

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

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

y cualquier par (x, y) puede escalarse, multiplicarse por un número real s, para obtener otro vector (sx, sy).

Universidad de Talca Taller de Matemática 2002 Estudiantes de Enseñanza Media

Tema 2. Tipos predefinidos

Algoritmos y programas. Algoritmos y Estructuras de Datos I

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

LA RECTA Y SUS ECUACIONES

Tema 5: Definiciones de listas por comprensión

Proyecto Clases de Tipos: Polinomios

Tipos abstractos. Taller de Álgebra I. Segundo cuatrimestre de 2013

Tema 5: Definiciones de listas por comprensión

Números primos y criterios de divisibilidad

Introducción a Haskell. El lenguaje Haskell

Programación Funcional

MATHEMATICA. Geometría - Recta. Ricardo Villafaña Figueroa. Material realizado con Mathematica. Ricardo Villafaña Figueroa

Ejercicio 2 Considere la representación para Lista de Naturales y Árbol Binario de Naturales de la Figura 1.

Polinomios. Taller de Álgebra I. Segundo cuatrimestre de 2013

Números, medidas y operaciones

Sesión del día 11 de Marzo del 2011 y tutoría del día 12 de Marzo del 2011

Aritmética en Haskell

Lógica y Programación

Curso Curso

= λ + 1 y el punto A(0, 7, 5)

Tema 4: Definición de funciones

Problemas Tema 7 Enunciados de problemas ampliación Temas 5 y 6

Tema 4: Definición de funciones

Programación Funcional en Haskell

Unidad 5: Geometría analítica del plano.

Bloque 33 Guía: Ubicación de puntos, distancia y longitudes en el plano cartesiano SGUICEG047EM33-A17V1

Materia: Matemática de 5to Tema: Ecuación vectorial. Marco Teórico

PROBLEMAS RESUELTOS SELECTIVIDAD ANDALUCÍA 2000 MATEMÁTICAS II TEMA 3: ESPACIO AFIN Y EUCLIDEO

Isabelle como un lenguaje funcional

MATEMÁTICA CPU MÓDULO 1. Números reales Ecuaciones e inecuaciones. Representaciones en la recta y en el plano.

Seminario de problemas-eso. Curso Hoja 10

1.- Álgebra de números complejos.

Tema 13: Aplicaciones de programación funcional

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

TALLER # 4 DE GEOMETRÍA EUCLIDIANA SEMEJANZAS Y RELACIONES MÉTRICAS. Universidad de Antioquia

Trabajo Práctico 1 - Programación Funcional Fecha de entrega: Jueves 20 de abril, hasta las 21 hs.

APUNTES 1 VECTORES M.C. CESAR GUERRA TORRES

3.1. Distancia entre dos puntos. Definición 3.1. Sean a, b e, se llama distancia entre los números a y b que se denota por d (a, b), a la cantidad:

Estructuras Discretas. Conjuntos. Conjuntos & Funciones. Especificación de Conjuntos.

SGUICEG024MT22-A16V1. SOLUCIONARIO Ubicación de puntos, distancia y longitudes en el plano cartesiano

Teorema de Pitágoras Distancia y Puntos Medios

Teorema de Pitágoras Distancia y Puntos Medios

Geometría del Espacio. Física Geográfica. Licenciatura de Humanidades. Febrero-Mayo,

Ejercicios 16/17 Lección 5. Geometría. 1. como combinación lineal de u = (2,5), expresa uno de ellos como combinación lineal de los otros dos.

GEOMETRÍA ANALÍTICA PARA LA CLASE. A (x 2 ;y 2 ) y 2. d(a,b) y 2 y 1. x 1 x 2. y 1. B (x 1 ;y 1 ) x 2. Geometría Analítica DISTANCIA ENTRE DOS PUNTOS

Slide 1 / 78. Teorema de Pitágoras Distancia y Puntos Medios

ÁLGEBRA VECTORIAL Y MATRICES. Ciclo 02 de Circunferencia.

TEMA 8. GEOMETRÍA ANALÍTICA.

PERIMETROS Y AREAS DE FIGURAS PLANAS

TRIGONOMETRÍA. CONVERSIÓN DE UN SISTEMA A OTRO Tomando como base la equivalencia de un sistema a otro, podemos establecer la siguiente fórmula:

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

La Lección de hoy es sobre el Perímetro y la Circunferencia. El cuál es la expectativa para el aprendizaje del estudiante m.3.g.2

Página 209 PARA RESOLVER. 44 Comprueba que el triángulo de vértices A( 3, 1), B(0, 5) y C(4, 2) es rectángulo

Ejercicios 17/18 Lección 5. Geometría. 1. como combinación lineal de u = (2,5), expresa uno de ellos como combinación lineal de los otros dos.

= 1 3 = 0,612 unidades cuadradas.

VECTORES : Las Cantidades Vectoriales cantidades escalares

Transcripción:

Tipos paramétricos y recursivos Taller de Álgebra I Verano 2017

Tipos paramétricos Tipos paramétricos Podemos hacer que los constructores de un tipo de datos reciban parámetros. A los tipos construidos de esta forma los llamamos tipos paramétricos. Por ejemplo: data Vector = Vector2D Float Float Vector3D Float Float Float Igual que antes, podemos hacer pattern matching utilizando los constructores del tipo. normavectorial :: Vector -> Float normavectorial ( Vector2D x y) = sqrt ( x ^ 2 + y ^ 2) normavectorial ( Vector3D x y z) = sqrt ( x ^ 2 + y ^ 2 + z ^ 2)

El tipo de datos Figura Consideremos el siguiente tipo de datos, que representa puntos en el plano. data Punto = Punto2D Float Float Queremos utilizarlo para definir un tipo de datos, Figura, que nos permita representar tanto rectángulos como círculos. Para simplificar, consideraremos rectángulos con lados paralelos a los ejes de coordenadas. Qué información necesitamos para representar de forma unívoca un rectángulo? Idea: dos Punto, representando a un par de esquinas opuestas. Y para representar un círculo? Idea: un Punto para representar el centro y un Float para representar el radio. Usando estas ideas: data Figura = Rectangulo Punto Punto Circulo Punto Float

Ejercicio: Algunas funciones con Figura data Punto = Punto2D Float Float data Figura = Rectangulo Punto Punto Circulo Punto Float Ejercicios Definir las siguientes funciones: circulounitario :: Figura, que devuelve un círculo de radio 1 centrado en el origen. cuadrado :: Float -> Figura, que devuelve un cuadrado con una esquina en el origen, tomando por parámetro la longitud de su diagonal. perimetro :: Figura -> Float, que recibe una figura y calcula su perímetro. area :: Figura -> Float, que recibe una figura y calcula su área.

Tipos paramétricos genéricos Con los tipos paramétricos, podemos representar un par ordenado de números enteros: data ParOrdenado = Par Integer Integer Pero también podríamos querer pares de elementos de otros tipos. Por ejemplo: data ParOrdenado = Par Float Float data ParOrdenado = Par Bool Bool Podremos generalizar esto? Sí. Podemos usar tipos paramétricos genéricos, y definir toda una familia de tipos en una sola ĺınea. data ParOrdenado a = Par a a Hace falta que los dos elementos sean del mismo tipo? No. Esto también vale: data ParOrdenado a b = Par a b

Tipos paramétricos genéricos: Ejercicios Ejercicios Considerando la definición data ParOrdenado a b = Par a b Cuál es el tipo de las siguientes expresiones? Par 4 5.25 Par False [1,8,-4] Par (Par 'a' 5) 3.14 Programar las siguientes funciones: primero :: ParOrdenado a b -> a, que devuelve el primer elemento de un par ordenado. segundo :: ParOrdenado a b -> b, que devuelve el segundo elemento de un par ordenado.

El secreto de las tuplas Todo lo anterior tiene un aire familiar... No se parece mucho a las tuplas? Efectivamente, las tuplas que Haskell trae de fábrica son tipos paramétricos genéricos. Sus constructores son los ya conocidos paréntesis y comas. Así, tenemos: (,) :: a -> b -> (a, b), (,,) :: a -> b -> c -> (a, b, c), (,,,) :: a -> b -> c -> d -> (a, b, c, d), etc. Esto es lo que nos permite hacer pattern matching en tuplas.

La estructura recursiva de las listas Con las herramientas que vimos hasta ahora, podemos construir varios de los tipos de datos con los que venimos trabajando desde el principio del taller. Qué pasa con las listas? Una característica fundamental de las listas es que pueden definirse de manera recursiva. Toda lista es: (a) la lista vacía, o (b) el resultado de agregar un elemento al principio de otra lista.

Tipos de datos recursivos Tipos recursivos Decimos que un tipo de datos es recursivo cuando alguno de sus constructores toma por parámetro una instancia del mismo tipo que estamos definiendo. Como ya vimos, las listas tienen estructura recursiva, por lo que podemos definirlas en Haskell como un tipo recursivo. Por ejemplo, podríamos definir nuestras propias listas de esta forma: data Lista a = ListaVacia Agregar a ( Lista a)

Tipos recursivos: Ejercicios Ejercicios A partir de la siguiente definición de listas como tipos recursivos data Lista a = ListaVacia Agregar a ( Lista a) deriving ( Show ) programar las siguientes funciones: 1 esvacia :: Lista a -> Bool que determina si una lista es o no la lista vacía. 2 (a) cabeza :: Lista a -> a (b) cola :: Lista a -> Lista a (c) concatenar :: Lista a -> Lista a -> Lista a (d) longitud :: Lista a -> Integer equivalentes a las funciones head, tail, (++) y length de las listas por defecto de Haskell. 3 suma :: Lista Float -> Float que determina la suma de una lista de Float. 4 posicion :: Lista a -> Integer -> a que devuelve el elemento en la posición pasado como parámetro.

Pattern matching en listas Las listas por defecto de Haskell también están definidas como tipos recursivos. Sus constructores son los siguientes: [] :: [a], la lista vacía, y (:) :: a -> [a] -> [a], que agrega un elemento al principio de otra lista. Utilizando estos constructores, podemos hacer pattern matching en listas. Por ejemplo, la función: producto :: [ Integer ] -> Integer producto xs length xs == 0 = 1 otherwise = head xs * producto ( tail xs) puede reescribirse como: producto :: [ Integer ] -> Integer producto [] = 1 producto ( x: xs) = x * producto xs

Ejercicios 1 Completar las siguientes definiciones. (a) longitud :: [a] -> Integer longitud [] = longitud (x : []) = longitud (x : y : []) = longitud (x : y : z : []) = longitud ( _ : _ : _ : xs) = (b) iniciales :: [ Char ] -> [ Char ] -> [ Char ] iniciales nombre apellido = where (n : _) = nombre (a : _) = apellido 2 Implementar las siguientes funciones, utilizando pattern matching. (a) tuplas :: [a] -> [b] -> [(a,b)], que calcule una lista de tuplas donde las primeras componentes sean elementos de la primera lista, y las segundas componentes de la segunda lista. Si las listas son de distinta longitud, se deben usar tantos elementos como se pueda. Nota: en Haskell esta función existe, y se llama zip. Ejemplo: tuplas [1,2,3,4] ['a','b','c'] [(1,'a'),(2,'b'),(3,'c')] (b) intercalar :: [a] -> [a] -> [a], que dadas dos listas, devuelve la lista resultante de colocar de forma intercalada un elemento de cada lista. Ejemplo: intercalar [1,3,5,7,9] [2,4] [1,2,3,4,5,7,9]