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

41
Definición de tipos de datos

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

Page 1: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

Definición de tipos de datos

Page 2: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

Page 3: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

Page 4: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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?

Page 5: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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í!

Page 6: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 7: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 8: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

….

Page 9: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

Page 10: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 11: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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?

Page 12: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

Definición de tipos de datosEntonces ¿qué hacemos?

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

Page 13: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 14: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

Definición de tipos de datosLos valores posibles para un día de la semana son siete.Definamos entonces esas opciones:

Page 15: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 16: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 17: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

Page 18: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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” ……

Page 19: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 20: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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:

Page 21: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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”

Page 22: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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”

Page 23: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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”

Page 24: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 25: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 26: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 27: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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)

Page 28: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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:

Page 29: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 30: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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:

Page 31: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

Page 32: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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:

Page 33: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

Page 34: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

Page 35: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 36: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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)

Page 37: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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)

Page 38: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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.

Page 39: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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

Page 40: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

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)

Page 41: datos Definición de tipos de - cs.famaf.unc.edu.armdoming/docencia/algo1/Tipos_en_Hask… · Definición de tipos de datos Vimos que Haskell es un lenguaje tipado. Toda expresión

Definición de tipos de datos

Para leer más:

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