Tracks
/
F#
F#
/
Übungen
/
Valentinstag
Valentinstag

Valentinstag

Lernübung

Einführung

Diskriminierte Unions

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"

Anleitung

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:

  • Ein Brettspiel spielen
  • Abhängen
  • Einen Film anschauen
  • In ein Restaurant gehen
  • Spazieren gehen

Du hast sechs Aufgaben, die dir bei der Wahl deiner Valentinstagsaktivität helfen.

1. Definiere die Zustimmung

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.

2. Definiere die Küchen

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.

3. Definiere die Filmgenres

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.

4. Definiere die Aktivität

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.

5. Bewerte die Aktivität

Jetzt bist du bereit, die Ideen deines Partners zu bewerten. So denkst du über die Ideen deines Partners:

  • Ein Brettspiel spielen: nein.
  • Abhängen: nein.
  • Einen Film anschauen: ja, wenn es ein romantischer Film ist, sonst nein.
  • In ein Restaurant gehen: ja, wenn die Küche koreanisch ist, vielleicht, wenn sie türkisch ist.
  • Spazieren gehen: ja, wenn der Spaziergang kürzer als drei Kilometer ist, vielleicht, wenn er kürzer als fünf Kilometer ist, sonst nein.

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
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
F# Exercism

Bereit, mit Valentinstag zu starten?

Melde dich bei Exercism an, um F# mit 18 Konzepte148 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.