Rutas
/
Haskell
Haskell
/
Ejercicios
/
Día de San Valentín
Día de San Valentín

Día de San Valentín

Ejercicio de aprendizaje

Introducción

Un tipo de dato algebraico (TDA) representa un número fijo de casos con nombre. Cada valor de un TDA se corresponde exactamente con uno de esos casos.

Un TDA se define con la palabra clave data, con los casos separados por barras verticales (|). Si ninguno de los casos tiene datos asociados, el TDA es similar a lo que en otros lenguajes se suele llamar una enumeración (o enum).

data Season
  = Spring
  | Summer
  | Autumn
  | Winter

Cada caso de un TDA puede tener datos asociados de forma opcional, y los distintos casos pueden tener distintos tipos de datos. Cuando un caso tiene datos asociados, se necesita un constructor.

data Number
  = NInt Int      --'NInt' is the constructor for an Int Number.
  | NFloat Float  --'NFloat' is the constructor for an Float Number.
  | Invalid       --'Invalid' does not have data associated to it.

Para crear un valor de un caso concreto, basta con referirse a su nombre (por ejemplo, NInt 22). Como los nombres de los casos no son más que funciones constructoras, los datos asociados se pueden pasar como un argumento normal de función.

Los TDA tienen igualdad estructural, lo que significa que dos valores del mismo caso y con los mismos datos (opcionales) son equivalentes.

Aunque se pueden usar expresiones if/else para trabajar con TDA, la forma recomendada de hacerlo es la coincidencia de patrones mediante la instrucción case:

add1 :: Number -> String
add1 number =
    case number of
      NInt    i -> show (i + 1)
      NFloat  f -> show (f + 1.0)
      Invalid   -> error "Invalid input"

Instrucciones

En este ejercicio es el día de San Valentín y estás planeando qué hacer con tu pareja. Tu pareja tiene un montón de ideas y te pide que las valores para encontrar la mejor actividad.

Tu pareja propone las siguientes ideas:

  • Jugar a un juego de mesa
  • Relajarse
  • Ver una película
  • Ir a un restaurante
  • Dar un paseo

Tienes seis tareas para ayudarte a elegir tu actividad del día de San Valentín.

1. Define la aprobación

Para cada idea que propone tu pareja, respondes con una de tres opciones: sí, no o quizás.

Define el tipo de datos algebraico Approval para representar estas opciones con los tres casos siguientes: Yes, No o Maybe.

2. Define las cocinas

Tu pareja ha seleccionado dos restaurantes posibles: uno de cocina coreana y otro de cocina turca.

Define el tipo de datos algebraico Cuisine para representar estos restaurantes con los dos casos siguientes: Korean o Turkish.

3. Define los géneros de películas

Hay muchísimas películas entre las que elegir, así que, para acotar las opciones, tu pareja también indica su género preferido.

Define el tipo de datos algebraico Genre para representar los siguientes casos de género: Crime, Horror, Romance o Thriller.

4. Define la actividad

Como ya se ha mencionado, a tu pareja se le han ocurrido cinco actividades posibles: jugar a un juego de mesa, relajarse, ver una película, ir a un restaurante y dar un paseo.

Define el tipo de datos algebraico Activity para representar estos tipos de actividad:

  • BoardGame: sin datos asociados.
  • Chill: sin datos asociados.
  • Movie: tiene su Genre como dato asociado.
  • Restaurant: tiene su Cuisine como dato asociado.
  • Walk: tiene un Int que representa el número de kilómetros que hay que caminar como dato asociado.

5. Valora la actividad

Por último, ya estás listo para valorar las ideas de tu pareja. Esto es lo que opinas de la idea de tu pareja:

  • Jugar a un juego de mesa: no.
  • Relajarse: no.
  • Ver una película: sí si es una película romántica; de lo contrario, no.
  • Ir a un restaurante: sí si la cocina es coreana, quizás si es turca.
  • Dar un paseo: sí si el paseo es de menos de tres kilómetros; quizás si está entre tres y cinco kilómetros (ambos incluidos); de lo contrario, no.

Implementa una función llamada rateActivity que reciba un valor Activity y devuelva el Approval en función de las opiniones anteriores. Por ejemplo:

rateActivity (Restaurant Turkish)
-- -> Maybe
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Haskell Exercism

¿Listo para empezar Día de San Valentín?

Regístrate en Exercism para aprender y dominar Haskell con 107 ejercicios y mentoría humana real, todo gratis.