Los tipos personalizados de Elm representan un número fijo de casos con nombre. Cada valor se corresponde con exactamente uno de esos casos con nombre.
Un tipo personalizado se define con la palabra clave type y requiere muy poca sintaxis. Son una de las técnicas más importantes de la programación en Elm y se usan para que los valores posibles en el código coincidan exactamente con los valores válidos de la vida real, lo que no deja cabida a datos inválidos y hace que los estados imposibles no se puedan representar en el código.
type Season
= Spring
| Summer
| Autumn
| Winter
Cada caso de un tipo personalizado puede tener datos asociados de forma opcional, y distintos casos pueden tener distintos tipos de datos. Si ninguno de los casos tiene datos asociados, la unión discriminada se parece a lo que en otros lenguajes se suele llamar una enumeración (o enum).
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
Puedes crear un valor para un caso concreto refiriéndote a su nombre (Spring) cuando este está definido en el mismo módulo o se importa con la sintaxis import SeasonModule exposing (Season(..)), o bien refiriéndote a su nombre totalmente cualificado (Season.Spring) cuando se importa con la sintaxis import SeasonModule exposing (Season).
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
Los tipos personalizados, al igual que todo en Elm, tienen igualdad estructural, lo que significa que dos valores del mismo caso y con los mismos datos (opcionales) son equivalentes.
La forma preferida de trabajar con tipos personalizados es la coincidencia de patrones:
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
En este ejercicio es San Valentín y tú y tu pareja estáis planeando hacer algo bonito juntos. Tu pareja tiene un montón de ideas y ahora te pide que las valores para encontrar la actividad que vais a hacer.
Tu pareja propone las siguientes ideas:
Tienes seis tareas que te ayudarán a elegir tu actividad para San Valentín.
Para cada idea que proponga tu pareja, respondes con una de estas tres opciones: sí, no o quizá.
Define el tipo personalizado Approval para representar estas opciones con los tres casos siguientes: Yes, No y Maybe.
Tu pareja ha seleccionado dos posibles restaurantes: uno de cocina coreana y otro de cocina turca.
Define el tipo personalizado Cuisine para representar estas cocinas con los dos casos siguientes: Korean y Turkish.
Hay muchísimas películas entre las que elegir, así que, para acotar un poco, tu pareja también indica su género.
Define el tipo personalizado Genre para representar los siguientes géneros como casos: Crime, Horror, Romance y Thriller.
Como decíamos, tu pareja ha propuesto cinco actividades diferentes: jugar a un juego de mesa, relajarse, ver una película e ir a un restaurante.
Define el tipo personalizado Activity para representar estos tipos de actividad:
BoardGame: no tiene datos asociados.Chill: no tiene datos asociados.Movie: tiene su Genre como dato asociado.Restaurant: tiene su Cuisine como dato asociado.Por último, ya puedes valorar las ideas de tu pareja. Así es como te sientes respecto a la idea de tu pareja:
Implementa una función llamada rateActivity que tome un valor de tipo Activity y devuelva el Approval correspondiente según lo anterior:
rateActivity (Restaurant Turkish)
-- => Maybe
Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.