Benutzerdefinierte Typen in Elm stellen eine feste Anzahl benannter Fälle dar. Jeder Wert entspricht genau einem der benannten Fälle.
Ein benutzerdefinierter Typ wird mit dem Schlüsselwort type definiert und benötigt nur sehr wenig Syntax. Sie sind eine der wichtigsten Techniken in der Elm-Programmierung und werden eingesetzt, damit die möglichen Werte im Code genau den gültigen Werten in der realen Welt entsprechen. Das lässt keinen Raum für ungültige Daten und macht unmögliche Zustände im Code nicht darstellbar.
type Season
= Spring
| Summer
| Autumn
| Winter
Jeder Fall eines benutzerdefinierten Typs kann optional zugeordnete Daten haben, und verschiedene Fälle können unterschiedliche Datentypen haben. Wenn keinem der Fälle Daten zugeordnet sind, ähnelt die diskriminierte Union dem, was andere Sprachen üblicherweise als Aufzählung (oder Enum) bezeichnen.
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
Einen Wert für einen bestimmten Fall erstellst du, indem du auf seinen Namen (Spring) verweist, wenn er im selben Modul definiert oder mit der Importsyntax import SeasonModule exposing (Season(..)) importiert wurde, oder indem du auf seinen voll qualifizierten Namen (Season.Spring) verweist, wenn er mit der Importsyntax import SeasonModule exposing (Season) importiert wurde.
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
Benutzerdefinierte Typen haben, wie alles in Elm, strukturelle Gleichheit. Das bedeutet, dass zwei Werte für denselben Fall und mit denselben (optionalen) Daten äquivalent sind.
Die bevorzugte Art, mit benutzerdefinierten Typen zu arbeiten, ist Musterabgleich:
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
In dieser Übung ist Valentinstag, und du und dein Partner wollt gemeinsam etwas Schönes unternehmen. Dein Partner hat jede Menge Ideen und bittet dich nun, die Ideen zu bewerten, um herauszufinden, welche Aktivität ihr unternehmen könnt.
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: yes, no oder maybe.
Definiere den Custom Type 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 das andere mit türkischer Küche.
Definiere den Custom Type Cuisine, um diese Küchen als die folgenden zwei Fälle darzustellen: Korean und Turkish.
Es gibt unzählige Filme zur Auswahl. Um die Auswahl einzugrenzen, nennt dein Partner zusätzlich das Genre.
Definiere den Custom Type Genre, um die folgenden Genres als Fälle darzustellen: Crime, Horror, Romance und Thriller.
Wie gesagt hat sich dein Partner fünf verschiedene Aktivitäten ausgedacht: ein Brettspiel spielen, entspannen, einen Film anschauen und in ein Restaurant gehen.
Definiere den Custom Type Activity, um diese Aktivitätstypen darzustellen:
BoardGame: keine zugeordneten Daten.Chill: keine zugeordneten Daten.Movie: hat sein Genre als zugeordnete Daten.Restaurant: hat sein Cuisine als zugeordnete Daten.Schließlich bist du bereit, die Ideen deines Partners zu bewerten. Das hältst du von der Idee deines Partners:
Implementiere eine Funktion namens rateActivity, die einen Activity-Wert entgegennimmt und anhand der oben genannten Einschätzungen einen Approval-Wert zurückgibt:
rateActivity (Restaurant Turkish)
-- => Maybe
Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.