Definición de tipos de
datos
Definición de tipos de datos
Vimos que Haskell es un lenguaje tipado. Toda expresión
tiene un tipo de datos.
Definición de tipos de datos
Vimos que Haskell es un lenguaje tipado. Toda expresión tiene un tipo de datos.
En el Prelude tenemos definidos muchos tipos de datos:
Int, Bool, Char, etc...
Definición de tipos de datos
Vimos que Haskell es un lenguaje tipado. Toda expresión tiene un tipo de datos.
En el Prelude tenemos definidos muchos tipos de datos:
Int, Bool, Char, etc…
¿Podemos extender el lenguaje definiendo más tipos?
Definición de tipos de datos
Vimos que Haskell es un lenguaje tipado. Toda expresión tiene un tipo de datos.
En el Prelude tenemos definidos muchos tipos de datos:
Int, Bool, Char, etc…
¿Podemos extender el lenguaje definiendo más tipos?
¡Claro que sí!
Definición de tipos de datos
Supongamos que estamos desarrollando una agenda
electrónica muy básica en la cual tenemos tareas fijas que
realizamos cada día de la semana.
Definición de tipos de datos
Supongamos que estamos desarrollando una agenda
electrónica muy básica en la cual tenemos tareas fijas que realizamos cada día de la semana.
Para ello queremos definir una función en Haskell que para
cada día de la semana me devuelva un string con el texto
correspondiente a la tarea.
Definición de tipos de datos
Con todo lo que vimos hasta ahora en el curso, podríamos definir una función:
tareaDiaria :: Int -> String
tareaDiaria 0 = “Trabajar” -- corresponde al lunes tareaDiaria 1 = “Trabajar” -- corresponde al martes
….
Definición de tipos de datos
Con todo lo que vimos hasta ahora en el curso, podríamos definir una función:
tareaDiaria :: Int -> String
tareaDiaria 0 = “Trabajar” -- corresponde al lunes tareaDiaria 1 = “Trabajar” -- corresponde al martes
….
Y luego siempre debemos acordarnos que el 0 representa
el Lunes, el 1 el Martes, etc...
Definición de tipos de datos
Si bien eso podría funcionar, requiere que tengamos
mucho cuidado al usarlo, y además el tipo de dato no es
muy específico para lo que necesitamos. Un entero no
necesariamente es un día de la semana.
Definición de tipos de datos
Si bien eso podría funcionar, requiere que tengamos
mucho cuidado al usarlo, y además el tipo de dato no es muy específico para lo que necesitamos. Un entero no necesariamente es un día de la semana.
Entonces ¿qué hacemos?
Definición de tipos de datos
Entonces ¿qué hacemos?
Definamos un tipo de dato nuevo que represente a los
días de la semana.
Definición de tipos de datos
Entonces ¿qué hacemos?
Definamos un tipo de dato nuevo que represente a los días de la semana.
Para ello definiremos todas los valores posibles que
puede tener un elemento del tipo de dato que estamos
definiendo.
Definición de tipos de datos
Los valores posibles para un día de la semana son siete.
Definamos entonces esas opciones:
Definición de tipos de datos
Los valores posibles para un día de la semana son siete.
Definamos entonces esas opcione
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
Con la palabra reservada data podemos definir un nuevo tipo de dato (con un nombre en mayúscula) dando alternativas de construcción. Un constructor puede ser cualquier palabra que empiece con mayúscula.
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
Ahora contamos con el tipo Dia y la manera de obtener
valores del tipo es mediante los siete constructores que
definimos.
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
Ahora contamos con el tipo Dia y la manera de obtener valores del tipo es mediante los siete constructores que definimos.
Podemos ver en ghci:
Main> :t Lunes Lunes :: Dia
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
Podemos definir entonces la función tareaDiaria ahora con un tipo más preciso:
tareaDiaria :: Dia -> String tareaDiaria Lunes = “Trabajar”
tareaDiaria Martes = “Trabajar”
……
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
tareaDiaria :: Dia -> String tareaDiaria Lunes = “Trabajar”
tareaDiaria Martes = “Trabajar”
……
La manera en que definimos la función es mediante
pattern matching.
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
El pattern matching es un mecanismo para definir funciones, en el
cual podemos dar reglas para las distintas alternativas que tiene un
tipo de dato, mediante sus constructores:
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
El pattern matching es un mecanismo para definir funciones, en el cual podemos dar reglas para las distintas alternativas que tiene un tipo de dato, mediante sus constructores:
tareaDiaria :: Dia -> String
tareaDiaria Lunes = “Trabajar”
tareaDiaria Martes = “Trabajar”
tareaDiaria Miercoles = “Trabajar”
tareaDiaria Jueves = “Trabajar”
tareaDiaria Viernes = “Trabajar poco”
tareaDiaria Sabado = “Salir de joda”
tareaDiaria Domingo = “Descansar”
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
Tenemos muchos casos en los que la definición es la misma. Para ello podemos agrupar casos utilizando un patrón más genérico: Con un
identificador (cualquier palabra en minúscula) representaremos cualquier valor del tipo Dia:
tareaDiaria :: Dia -> String
tareaDiaria Lunes = “Trabajar”
tareaDiaria Martes = “Trabajar”
tareaDiaria Miercoles = “Trabajar”
tareaDiaria Jueves = “Trabajar”
tareaDiaria Viernes = “Trabajar poco”
tareaDiaria Sabado = “Salir de joda”
tareaDiaria Domingo = “Descansar”
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
tareaDiaria :: Dia -> String
tareaDiaria Viernes = “Trabajar poco”
tareaDiaria Sabado = “Salir de joda”
tareaDiaria Domingo = “Descansar”
tareaDiaria otrodia = “Trabajar”
Definición de tipos de datos
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
tareaDiaria :: Dia -> String
tareaDiaria Viernes = “Trabajar poco”
tareaDiaria Sabado = “Salir de joda”
tareaDiaria Domingo = “Descansar”
tareaDiaria otrodia = “Trabajar”
En la última ecuación, otrodia representa cualquier otro elemento posible del tipo Dia.
Definición de tipos de datos
En otro ejemplo, pensemos que queremos representar las figuras geométricas Círculo y Rectángulo, para así definir una función que calcule su área.
Definición de tipos de datos
En otro ejemplo, pensemos que queremos representar las figuras geométricas Círculo y Rectángulo, para así definir una función que calcule su área.
Un círculo podemos definirlo dando un par de números que representen el centro y otro número que represente el radio.
Un rectángulo podemos definirlo dando dos pares de números: El borde inferior izquierdo y el borde superior derecho.
Definición de tipos de datos
En otro ejemplo, pensemos que queremos representar las figuras geométricas Círculo y Rectángulo, para así definir una función que calcule su área.
Un círculo podemos definirlo dando un par de números que representen el centro y otro número que represente el radio.
Un rectángulo podemos definirlo dando dos pares de números: El borde inferior izquierdo y el borde superior derecho.
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
Definición de tipos de datos
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
Para construir un elemento de tipo Figura, tenemos dos alternativas, pero cada se construye de manera distinta:
Definición de tipos de datos
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
Para construir un elemento de tipo Figura, tenemos dos alternativas, pero cada se construye de manera distinta:
El constructor Circulo requiere un par de Float y otro Float para poder construir una figura.
El constructor Rectangulo requiere dos pares de Float.
Definición de tipos de datos
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
Los constructores Circulo y Rectangulo tienen parámetros. La expresión
“Circulo” no es un elemento del tipo Figura sino que es una función que toma un (Float,Float) y un Float y devuelve una Figura:
Definición de tipos de datos
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
Los constructores Circulo y Rectangulo tienen parámetros. La expresión
“Circulo” no es un elemento del tipo Figura sino que es una función que toma un (Float,Float) y un Float y devuelve una Figura:
*Main> :t Circulo
Circulo :: (Float, Float) -> Float -> Figura
Definición de tipos de datos
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
Ahora entonces podríamos definir la función área utilizando pattern matching:
Definición de tipos de datos
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
Ahora entonces podríamos definir la función área utilizando pattern matching:
area :: Figura -> Float
area (Circulo (x,y) r) = 3.1416 * r * r area (Rectangulo (x1,y1) (x2,y2)) = base * altura where base = x2 - x1
altura = y2 - y1
Definición de tipos de datos
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
Ahora entonces podríamos definir la función área utilizando pattern matching:
area :: Figura -> Float
area (Circulo (x,y) r) = 3.1416 * r * r area (Rectangulo (x1,y1) (x2,y2)) = base * altura where base = x2 - x1
altura = y2 - y1
Los identificadores x e y representan a cualquier valor de tipo Float. De igual forma tenemos los identificadores r, x1, y1, x2, y2 para el resto de los parámetros
Definición de tipos de datos
Algunas veces queremos definir un tipo de dato como sinónimo de
otro, si bien ambos son iguales, para tener claridad en el código puede
que querramos ponerle otro nombre.
Definición de tipos de datos
Algunas veces queremos definir un tipo de dato como sinónimo de otro, si bien ambos son iguales, para tener claridad en el código puede que querramos ponerle otro nombre.
En el ejemplo de las Figuras, dijimos que el par (Float,Float)
representa un punto en el plano. Podemos entonces definir el tipo
Punto como un sinónimo del tipo (Float,Float)
Definición de tipos de datos
Algunas veces queremos definir un tipo de dato como sinónimo de otro, si bien ambos son iguales, para tener claridad en el código puede que querramos ponerle otro nombre.
En el ejemplo de las Figuras, dijimos que el par (Float,Float) representa un punto en el plano. Podemos entonces definir el tipo Punto como un sinónimo del tipo (Float,Float)
type Punto = (Float,Float)
Definición de tipos de datos
Algunas veces queremos definir un tipo de dato como sinónimo de otro, si bien ambos son iguales, para tener claridad en el código puede que querramos ponerle otro nombre.
En el ejemplo de las Figuras, dijimos que el par (Float,Float) representa un punto en el plano. Podemos entonces definir el tipo Punto como un sinónimo del tipo (Float,Float)
type Punto = (Float,Float)
Con la palabra reservada type se definen sinónimos de tipos.
Definición de tipos de datos
El tipo Figura entonces ahora podría definirse así:
type Punto = (Float,Float)
data Figura = Circulo Punto Float
| Rectangulo Punto Punto
Definición de tipos de datos
En resumen, vimos cómo definir tipos de datos nuevos:
● Definiendo todos los valores posibles que tiene un elemento para pertenecer al tipo.
○ Constructores sin parámetros (constantes):
data Dia = Lunes | Martes | Miercoles | Jueves | Viernes | Sabado | Domingo
○ Constructores con parámetros:
data Figura = Circulo (Float,Float) Float
| Rectangulo (Float,Float) (Float,Float)
● Sinónimos de tipos:
type Punto = (Float,Float)