Eine diskriminierte Union stellt eine feste Anzahl benannter Fälle dar. Jeder Wert einer diskriminierten Union entspricht genau einem dieser benannten Fälle.
Du definierst eine diskriminierte Union mit dem Schlüsselwort type. Die einzelnen Fälle trennst du durch das Pipe-Zeichen (|):
type Season =
| Spring
| Summer
| Autumn
| Winter
Jeder Fall einer diskriminierten Union kann optional zugeordnete Daten haben, und verschiedene Fälle können unterschiedliche Datentypen haben. Wenn kein Fall zugeordnete Daten hat, ähnelt die diskriminierte Union dem, was andere Sprachen üblicherweise als Enumeration (oder Enum) bezeichnen.
type Number =
| Integer of int
| Float of float
| Invalid
Um einen Wert für einen bestimmten Fall zu erzeugen, gibst du seinen Namen an (z. B. Success). Da Fallnamen einfach Konstruktorfunktionen sind, kannst du die zugeordneten Daten wie ein normales Argument übergeben. Wenn eine andere diskriminierte Union bereits einen Fall mit demselben Namen definiert hat, musst du den vollständigen Namen verwenden (z. B. Result.Success).
let byName = Integer 2
let byFullName = Number.Invalid
Diskriminierte Unions besitzen strukturelle Gleichheit. Das heißt, zwei Werte für denselben Fall mit denselben (optionalen) Daten sind gleichwertig.
Du kannst zwar Ausdrücke mit if/elif/else verwenden, um mit diskriminierten Unions zu arbeiten, der empfohlene Weg ist aber der Musterabgleich mit dem Bezeichnermuster:
let describe number =
match number with
| Integer i -> sprintf "Integer: %d" i
| Float d -> sprintf "Float: %f" d
| Invalid -> "Invalid"
In dieser Übung ist Valentinstag und du und dein Partner wollt zusammen etwas Schönes unternehmen. Dein Partner hat viele Ideen und bittet dich nun darum, sie zu bewerten, um die passende Aktivität zu finden.
Die folgenden Ideen schlägt dein Partner vor:
Du hast sechs Aufgaben, die dir bei der Wahl deiner Valentinstagsaktivität helfen.
Auf jede Idee, die dein Partner vorschlägt, antwortest du mit einer von drei Optionen: ja, nein oder vielleicht.
Definiere die diskriminierte Union Approval, um diese Optionen als die folgenden drei Fälle darzustellen: Yes, No und Maybe.
Dein Partner hat zwei mögliche Restaurants ausgewählt: eines mit koreanischer Küche und eines mit türkischer Küche.
Definiere die diskriminierte Union Cuisine, um diese Küchen als die folgenden zwei Fälle darzustellen: Korean und Turkish.
Es gibt unzählige Filme zur Auswahl. Damit die Auswahl überschaubarer wird, nennt dein Partner auch jeweils das Genre.
Definiere die diskriminierte Union Genre, um die folgenden Genres als Fälle darzustellen: Crime, Horror, Romance und Thriller.
Wie schon gesagt, hat sich dein Partner fünf verschiedene Aktivitäten ausgedacht: ein Brettspiel spielen, abhängen, einen Film anschauen, in ein Restaurant gehen und spazieren gehen.
Definiere die diskriminierte Union Activity, um diese Aktivitätstypen darzustellen:
BoardGame: keine zugeordneten Daten.Chill: keine zugeordneten Daten.Movie: hat sein Genre als zugeordnete Daten.Restaurant: hat seine Cuisine als zugeordnete Daten.Walk: hat ein int, das die Anzahl der zu gehenden Kilometer angibt, als zugeordnete Daten.Jetzt bist du bereit, die Ideen deines Partners zu bewerten. So denkst du über die Ideen deines Partners:
Implementiere eine Funktion namens rateActivity, die einen Activity-Wert entgegennimmt und basierend auf den obigen Einschätzungen einen Approval-Wert zurückgibt:
rateActivity (Restaurant Turkish)
// => Maybe
Melde dich bei Exercism an, um F# mit 18 Konzepte148 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.