Tracks
/
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 datos algebraico (ADT) representa un número fijo de casos con nombre. Cada valor de un ADT corresponde exactamente a uno de los casos con nombre.

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

data Season
  = Spring
  | Summer
  | Autumn
  | Winter

Cada caso de un ADT puede tener datos asociados de forma opcional, y distintos casos pueden tener distintos tipos de datos. Cuando el caso tiene datos asociados, se requiere 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.

Crear un valor para un caso específico se puede hacer refiriéndose a su nombre (por ejemplo, NInt 22). Como los nombres de los casos son solo funciones constructoras, los datos asociados se pueden pasar como un argumento de función normal.

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

Si bien se pueden usar expresiones if/else para trabajar con los ADT, la forma recomendada de trabajar con ellos es mediante la coincidencia de patrones usando la sentencia 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 muchas ideas y te pide que las califiques para encontrar la mejor actividad.

Tu pareja propone las siguientes ideas:

  • Jugar 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 para los siguientes tres casos: Yes, No o Maybe.

2. Define las cocinas

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

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

3. Define los géneros de películas

Hay un montón de películas para elegir, así que, para acotar las opciones, tu pareja también enumera su género preferido.

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

4. Define la actividad

Como se mencionó, tu pareja ha propuesto cinco actividades posibles: jugar 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 para caminar como dato asociado.

5. Califica la actividad

Finalmente, ya puedes calificar las ideas de tu pareja. Así es como te sientes con la idea de tu pareja:

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

Implementa una función llamada rateActivity que recibe un valor Activity y devuelve el Approval según lo que se describe arriba. Por ejemplo:

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

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