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"
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:
Tienes seis tareas para ayudarte a elegir tu actividad del Día de San Valentí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.
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.
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.
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.Finalmente, ya puedes calificar las ideas de tu pareja. Así es como te sientes con la idea de tu pareja:
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
Regístrate en Exercism para aprender y dominar Haskell con 107 ejercicios y mentoría humana real, todo gratis.