Mit benutzerdefinierten Typen definierst du in Gleam neue Datentypen. Sie können mehrere Varianten haben, jede mit einem eigenen Namen.
pub type Season {
Spring
Summer
Autumn
Winter
}
Jede Variante eines benutzerdefinierten Typs kann optional Daten enthalten, und verschiedene Varianten können Daten unterschiedlicher Typen enthalten. Wenn eine Variante Daten enthält, nennt man sie ein Record.
pub type Number {
SomeInt(Int)
SomeFloat(Float)
Invalid
}
Einen Wert für eine bestimmte Variante erstellst du, indem du ihren Namen angibst, wenn sie keine zusätzlichen Daten enthält (Spring), oder indem du sie wie eine Funktion aufrufst, wenn sie welche enthält (SomeInt(2)).
let spring = Spring
let integerTwo = SomeInt(2)
Benutzerdefinierte Typen haben, wie alles in Gleam, strukturelle Gleichheit. Das bedeutet, dass zwei Werte derselben Variante mit denselben Daten gleichwertig sind.
Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False
Varianten benutzerdefinierter Typen lassen sich mit case-Ausdrücken per Pattern Matching abgleichen.
import gleam/int
import gleam/float
pub fn describe(flexible_number: Number) -> String {
case flexible_number {
SomeFloat(f) -> "Float: " <> float.to_string(f)
SomeInt(i) -> "Int: " <> int.to_string(i)
Invalid -> "Neither a float nor an int"
}
}
In dieser Übung ist Valentinstag und du und dein Partner plant, etwas Schönes zusammen zu unternehmen. Dein Partner hat jede Menge Ideen und bittet dich nun, die Ideen zu bewerten, um herauszufinden, welche Aktivität ihr unternehmen könnt.
Dein Partner schlägt die folgenden Ideen vor:
Du hast sechs Aufgaben, die dir helfen, deine Aktivität für den Valentinstag auszuwählen.
Auf jede Idee, die dein Partner vorschlägt, antwortest du mit einer von drei Optionen: ja, nein oder vielleicht.
Definiere den benutzerdefinierten Typ Approval, um diese Optionen durch 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 benutzerdefinierten Typ Cuisine, um diese Küchen durch die folgenden zwei Fälle darzustellen: Korean und Turkish.
Es gibt unzählige Filme zur Auswahl. Um die Auswahl einzugrenzen, gibt dein Partner auch das jeweilige Genre an.
Definiere den benutzerdefinierten Typ 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, abhängen, einen Film ansehen, in ein Restaurant gehen und einen Spaziergang machen.
Definiere den benutzerdefinierten Typ Activity, um diese Aktivitätsarten 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.Schließlich bist du bereit, die Ideen deines Partners zu bewerten. So denkst du über die Idee deines Partners:
Implementiere eine Funktion namens rate_activity, die einen Activity-Wert entgegennimmt und die Approval basierend auf den obigen Empfindungen zurückgibt:
rate_activity(Restaurant(Turkish))
// -> Maybe
Melde dich bei Exercism an, um Gleam mit 33 Konzepte122 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.