Tracks
/
Haskell
Haskell
/
Übungen
/
Valentinstag
Valentinstag

Valentinstag

Lernübung

Einführung

Ein algebraischer Datentyp (ADT) stellt eine feste Anzahl benannter Fälle dar. Jeder Wert eines ADT entspricht genau einem der benannten Fälle.

Ein ADT wird mit dem Schlüsselwort data definiert, wobei die Fälle durch Pipe-Zeichen (|) getrennt werden. Wenn keinem der Fälle Daten zugeordnet sind, ähnelt der ADT dem, was andere Sprachen üblicherweise als Enumeration (oder Enum) bezeichnen.

data Season
  = Spring
  | Summer
  | Autumn
  | Winter

Jedem Fall eines ADT können optional Daten zugeordnet werden, und verschiedene Fälle können unterschiedliche Datentypen haben. Wenn dem Fall Daten zugeordnet sind, ist ein Konstruktor erforderlich.

data Number
  = NInt Int      --'NInt' is the constructor for an Int Number.
  | NFloat Float  --'NFloat' is the constructor for an Float Number.
  | Invalid       --'Invalid' does not have data associated to it.

Einen Wert für einen bestimmten Fall erzeugst du, indem du seinen Namen angibst (z. B. NInt 22). Da Fallnamen einfach Konstruktorfunktionen sind, kannst du die zugehörigen Daten wie ein normales Funktionsargument übergeben.

ADTs haben strukturelle Gleichheit. Das bedeutet, dass zwei Werte für denselben Fall mit denselben (optionalen) Daten gleichwertig sind.

Du kannst zwar if/else-Ausdrücke verwenden, um mit ADTs zu arbeiten, der empfohlene Weg ist jedoch der Musterabgleich mit einer case-Anweisung:

add1 :: Number -> String
add1 number =
    case number of
      NInt    i -> show (i + 1)
      NFloat  f -> show (f + 1.0)
      Invalid   -> error "Invalid input"

Anleitung

In dieser Übung ist Valentinstag und du planst, was du mit deinem Partner unternehmen willst. Dein Partner hat viele Ideen und bittet dich, sie zu bewerten, um die beste Aktivität zu finden.

Die folgenden Ideen schlägt dein Partner vor:

  • Ein Brettspiel spielen
  • Entspannen
  • Einen Film anschauen
  • In ein Restaurant gehen
  • Einen Spaziergang machen

Du hast sechs Aufgaben, die dir helfen, deine Aktivität für den Valentinstag auszuwählen.

1. Definiere die Zustimmung

Für jede Idee, die dein Partner vorschlägt, antwortest du mit einer von drei Optionen: ja, nein oder vielleicht.

Definiere den algebraischen Datentyp Approval, um diese Optionen mit den folgenden drei Fällen darzustellen: Yes, No oder 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 den algebraischen Datentyp Cuisine, um diese Restaurants mit den folgenden zwei Fällen darzustellen: Korean oder Turkish.

3. Definiere die Filmgenres

Es gibt jede Menge Filme zur Auswahl. Um die Auswahl einzugrenzen, listet dein Partner auch sein bevorzugtes Genre auf.

Definiere den algebraischen Datentyp Genre, um die folgenden Genre-Fälle darzustellen: Crime, Horror, Romance oder Thriller.

4. Definiere die Aktivität

Wie bereits erwähnt, hat sich dein Partner fünf mögliche Aktivitäten ausgedacht: ein Brettspiel spielen, entspannen, einen Film anschauen, in ein Restaurant gehen und einen Spaziergang machen.

Definiere den algebraischen Datentyp 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 einen Int, der 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.
  • Entspannen: nein.
  • Einen Film anschauen: ja, wenn es ein romantischer Film ist; ansonsten nein.
  • In ein Restaurant gehen: ja, wenn die Küche koreanisch ist, vielleicht, wenn sie türkisch ist.
  • Einen Spaziergang machen: ja, wenn der Spaziergang kürzer als drei Kilometer ist; vielleicht, wenn er zwischen drei und fünf Kilometern liegt (einschließlich); ansonsten nein.

Implementiere eine Funktion namens rateActivity, die einen Activity-Wert entgegennimmt und anhand der obigen Einschätzungen einen Approval-Wert zurückgibt. Zum Beispiel:

rateActivity (Restaurant Turkish)
-- -> Maybe
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Haskell Exercism

Bereit, mit Valentinstag zu starten?

Melde dich bei Exercism an, um Haskell mit 107 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.