datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… ·...

Preview:

Citation preview

Definición de tipos de datos

Definición de tipos de datosVimos que Haskell es un lenguaje tipado. Toda expresión tiene un tipo de datos.

Definición de tipos de datosVimos 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 datosVimos 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 datosVimos 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 datosSupongamos 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 datosSupongamos 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 datosCon 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 datosCon 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 datosSi 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 datosSi 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 datosEntonces ¿qué hacemos?

Definamos un tipo de dato nuevo que represente a los días de la semana.

Definición de tipos de datosEntonces ¿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 datosLos valores posibles para un día de la semana son siete.Definamos entonces esas opciones:

Definición de tipos de datosLos 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosEn 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 datosEn 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 datosEn 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosdata 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 datosAlgunas 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 datosAlgunas 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 datosAlgunas 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 datosAlgunas 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 datosEn 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)

Definición de tipos de datos

Para leer más:

http://learnyouahaskell.com/making-our-own-types-and-typeclasses

Recommended