El tipo de unión discriminada representa una cantidad fija 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 con la palabra clave type, con los casos separados por el carácter de barra vertical (|):
type Season =
| Spring
| Summer
| Autumn
| Winter
Cada caso de una unión discriminada 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 suele llamarse una enumeración (o enum).
type Number =
| Integer of int
| Float of float
| Invalid
Para crear un valor de un caso específico, puedes hacer referencia a su nombre (por ejemplo, Success). Como los nombres de los casos son solo funciones constructoras, los datos asociados se pueden pasar como un argumento normal de función. Si otra unión discriminada definió un caso con el mismo nombre, vas a tener que usar su nombre completo (por ejemplo, Result.Success).
let byName = Integer 2
let byFullName = Number.Invalid
Las uniones discriminadas tienen igualdad estructural, lo que significa que dos valores del mismo caso y con los mismos datos (opcionales) son equivalentes.
Aunque puedes usar expresiones if/elif/else para trabajar con uniones discriminadas, la forma recomendada de trabajar con ellas es mediante la coincidencia de patrones con 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án planeando hacer algo lindo juntos. Tu pareja tiene muchas ideas y ahora te pide que las califiques para encontrar la actividad que van a hacer.
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 la unión discriminada Approval para representar estas opciones con los siguientes tres casos: Yes, No y Maybe.
Tu pareja eligió dos restaurantes posibles: uno de cocina coreana y el otro de cocina turca.
Define la unión discriminada Cuisine para representar estas cocinas con los siguientes dos casos: 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 siguientes géneros como casos: Crime, Horror, Romance y Thriller.
Como ya se dijo, tu pareja propuso cinco actividades diferentes: jugar 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 la cantidad de kilómetros que se van a caminar como dato asociado.Por último, ya puedes calificar las ideas de tu pareja. Así es como te sientes respecto a la idea de tu pareja:
Implementa una función llamada rateActivity que recibe un valor de tipo Activity y devuelve el Approval según los criterios anteriores:
rateActivity (Restaurant Turkish)
// => Maybe
Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.