El tipo de unión discriminada representa un número fijo de casos con nombre. Cada valor de una unión discriminada corresponde exactamente a uno de los casos con nombre.
Una unión discriminada se define usando la palabra clave type, con los casos separados por barras verticales (|):
type Season =
| Spring
| Summer
| Autumn
| Winter
Cada caso de una unión discriminada puede tener, opcionalmente, datos asociados, y distintos casos pueden tener distintos tipos de datos. Si ninguno de los casos tiene datos asociados, la unión discriminada es similar a lo que otros lenguajes suelen llamar una enumeración (o enum).
type Number =
| Integer of int
| Float of float
| Invalid
Se puede crear un valor para un caso específico haciendo referencia a su nombre (p. ej., Success). Como los nombres de los casos son solo funciones constructoras, los datos asociados se pueden pasar como un argumento de función normal. Si otra unión discriminada ha definido un caso con el mismo nombre, tendrás que usar su nombre completo (p. ej., Result.Success).
let byName = Integer 2
let byFullName = Number.Invalid
Las uniones discriminadas tienen igualdad estructural, lo que significa que dos valores para el mismo caso y con los mismos datos (opcionales) son equivalentes.
Aunque se pueden usar expresiones if/elif/else para trabajar con uniones discriminadas, la forma recomendada de trabajar con ellas es mediante la coincidencia de patrones usando el patrón de identificador:
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"
En este ejercicio es el día de 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 puntúes para encontrar la actividad que haréis.
Tu pareja propone las siguientes ideas:
Tienes seis tareas para ayudarte a elegir la actividad del día de San Valentín.
Para cada idea que propone tu pareja, respondes con una de estas tres opciones: sí, no o quizá.
Define la unión discriminada Approval para representar estas opciones mediante 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 la unión discriminada Cuisine para representar estas cocinas mediante los dos casos siguientes: Korean y Turkish.
Hay muchísimas películas entre las que elegir, así que, para acotar las opciones, tu pareja también indica su género.
Define la unión discriminada Genre para representar los géneros siguientes como casos: Crime, Horror, Romance y Thriller.
Como decíamos, a tu pareja se le han ocurrido cinco actividades distintas: jugar a un juego de mesa, relajarse, ver una película, ir a un restaurante y dar un paseo.
Define la unión discriminada 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.Por último, ya estás listo para puntuar las ideas de tu pareja. Así es como te sientes ante las ideas de tu pareja:
Implementa una función llamada rateActivity que toma un valor Activity y devuelve la Approval correspondiente según lo anterior:
rateActivity (Restaurant Turkish)
// => Maybe
Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.