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"
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:
Du hast sechs Aufgaben, die dir helfen, deine Aktivität für den Valentinstag auszuwählen.
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.
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.
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.
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.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 anhand der obigen Einschätzungen einen Approval-Wert zurückgibt.
Zum Beispiel:
rateActivity (Restaurant Turkish)
-- -> Maybe
Melde dich bei Exercism an, um Haskell mit 107 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.