• No se han encontrado resultados

Definición de tipos de datos

N/A
N/A
Protected

Academic year: 2022

Share "Definición de tipos de datos"

Copied!
41
0
0

Texto completo

(1)

Definición de tipos de

datos

(2)

Definición de tipos de datos

Vimos que Haskell es un lenguaje tipado. Toda expresión

tiene un tipo de datos.

(3)

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

(4)

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?

(5)

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

(6)

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.

(7)

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.

(8)

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

….

(9)

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

(10)

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.

(11)

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?

(12)

Definición de tipos de datos

Entonces ¿qué hacemos?

Definamos un tipo de dato nuevo que represente a los

días de la semana.

(13)

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.

(14)

Definición de tipos de datos

Los valores posibles para un día de la semana son siete.

Definamos entonces esas opciones:

(15)

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.

(16)

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.

(17)

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

(18)

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”

……

(19)

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.

(20)

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:

(21)

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”

(22)

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”

(23)

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”

(24)

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.

(25)

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.

(26)

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.

(27)

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)

(28)

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:

(29)

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.

(30)

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:

(31)

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

(32)

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:

(33)

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

(34)

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

(35)

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.

(36)

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)

(37)

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)

(38)

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.

(39)

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

(40)

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)

(41)

Definición de tipos de datos

Para leer más:

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

Referencias

Documento similar

El contar con el financiamiento institucional a través de las cátedras ha significado para los grupos de profesores, el poder centrarse en estudios sobre áreas de interés

De este modo, la inscripción del libro en la colección mencionada obliga al primero a aceptar los criterios de espec(ficidad artística que re\plan el campc la segunda. De

Emotional Competence and Emotion Socialization in Preschoolers: The Viewpoint of Preschool Teachers (Kılıç, 2015). El primer trabajo investigativo relevante para nuestro estudio

[r]

Me pregunté en qué pensaba cuando no había nadie más, cuando estaba sola y su belleza era solo para ella misma.. Decidimos mirar los archivos de La voz

[r]

[r]

Abstract: This paper reviews the dialogue and controversies between the paratexts of a corpus of collections of short novels –and romances– publi- shed from 1624 to 1637: