Algebraische Datentypen
Ihre Domäne modellieren
Algebraische Datentypen ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Scala for Backend Engineering & Functional Programming-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.
Was ist ein ADT?
Ein algebraischer Datentyp (ADT) ist ein Typ, der durch die Kombination anderer Typen entsteht. In Scala modellieren Sie ADTs mit einem sealed trait sowie Varianten als case class und case object.
Mit ADTs können Sie die Struktur Ihrer Fachdaten präzise beschreiben.
Summen-Typen
Ein Summen-Typ bedeutet, dass ein Wert eine von mehreren Alternativen ist (ODER). Eine Ampel ist Rot ODER Gelb ODER Grün.
Dies drücken Sie mit einem sealed Trait und mehreren Varianten aus.
sealed trait Light
case object Red extends Light
case object Yellow extends Light
case object Green extends Light
object Main {
def main(args: Array[String]): Unit = {
val l: Light = Yellow
println(l)
}
}Produkt-Typen
Ein Produkt-Typ bedeutet, dass ein Wert mehrere Felder kombiniert (UND). Ein Punkt hat eine x-Koordinate UND eine y-Koordinate.
Case-Klassen sind Produkt-Typen.
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(3, 4)
println(s"${p.x} and ${p.y}")
}
}Summen- und Produkt-Typen kombinieren
Reale ADTs kombinieren beides: ein sealed Trait (Summe), dessen Varianten Case-Klassen (Produkte) sind.
Hier ist eine Shape entweder ein Circle (mit Radius) ODER ein Rectangle (mit Breite und Höhe).
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(w: Double, h: Double) extends Shape
object Main {
def main(args: Array[String]): Unit = {
val s: Shape = Rectangle(3, 4)
println(s)
}
}Mit einem ADT arbeiten
Sie verarbeiten einen ADT, indem Sie ein Pattern Matching auf seinen Varianten durchführen. Jeder Zweig behandelt eine Form.
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(w: Double, h: Double) extends Shape
object Main {
def area(s: Shape): Double = s match {
case Circle(r) => 3.14159 * r * r
case Rectangle(w, h) => w * h
}
def main(args: Array[String]): Unit = {
println(area(Circle(2)))
println(area(Rectangle(3, 4)))
}
}Eine Domäne modellieren
ADTs machen ungültige Zustände nicht darstellbar. Modellieren Sie eine Zahlungsmethode als abgeschlossene Menge gültiger Optionen.
sealed trait PaymentMethod
case class CreditCard(number: String) extends PaymentMethod
case class BankTransfer(iban: String) extends PaymentMethod
case object Cash extends PaymentMethod
object Main {
def main(args: Array[String]): Unit = {
val m: PaymentMethod = Cash
println(m)
}
}Rekursive ADTs
Ein ADT kann auf sich selbst verweisen. So modellieren Sie Bäume und Listen. Hier sehen Sie einen einfachen Binärbaum.
sealed trait Tree
case object Leaf extends Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
object Main {
def main(args: Array[String]): Unit = {
val t: Tree = Node(1, Leaf, Node(2, Leaf, Leaf))
println(t)
}
}Einen rekursiven ADT durchlaufen
Mit Rekursion und Matching können Sie die gesamte Struktur verarbeiten. Hier summieren wir jeden Wert in einem Baum.
sealed trait Tree
case object Leaf extends Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
object Main {
def sum(t: Tree): Int = t match {
case Leaf => 0
case Node(v, l, r) => v + sum(l) + sum(r)
}
def main(args: Array[String]): Unit = {
val t = Node(1, Node(2, Leaf, Leaf), Node(3, Leaf, Leaf))
println(sum(t))
}
}Warum ADTs?
ADTs sind leistungsfähig, weil sie:
- Daten präzise als Summen und Produkte beschreiben
- Das Erzeugen ungültiger Zustände unmöglich machen
- Perfekt mit vollständigem Pattern Matching zusammenspielen
- Auf rekursive Strukturen wie Bäume und Listen skalieren
ADTs im Vergleich zu Vererbung
Traditionelles OOP würde das Verhalten über Unterklassen verteilen. ADTs halten die Datendefinitionen geschlossen und legen das Verhalten in Funktionen ab, die Pattern Matching verwenden.
Diese Trennung von Daten und Verhalten ist charakteristisch für funktionales Design.
Alles zusammenführen
Ein vollständiger kleiner ADT mit einer Funktion, die jede Variante behandelt.
sealed trait Json
case class JNum(n: Double) extends Json
case class JStr(s: String) extends Json
case object JNull extends Json
object Main {
def render(j: Json): String = j match {
case JNum(n) => n.toString
case JStr(s) => "\"" + s + "\""
case JNull => "null"
}
def main(args: Array[String]): Unit = {
List(JNum(3.0), JStr("hi"), JNull).foreach(j => println(render(j)))
}
}Schnelltest
Testen Sie Ihr Verständnis von ADTs.
Zusammenfassung
Sie haben gelernt, algebraische Datentypen zu erstellen:
- Summen-Typen: sealed Trait mit mehreren Varianten (ODER)
- Produkt-Typen: Case-Klassen mit Feldern (UND)
- Kombinieren Sie sie, um Domänen präzise zu modellieren
- ADTs können rekursiv sein (Bäume, Listen)
- Verarbeiten Sie sie mit Pattern Matching
Häufig gestellte Fragen
Ist die Lektion „Algebraische Datentypen“ kostenlos?
Ja — der vollständige Text von „Algebraische Datentypen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Scala for Backend Engineering & Functional Programming-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Algebraische Datentypen“?
Ihre Domäne modellieren Du übst Scala for Backend Engineering & Functional Programming mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Scala for Backend Engineering & Functional Programming zu starten?
Keine Vorkenntnisse erforderlich. Scala for Backend Engineering & Functional Programming auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Algebraische Datentypen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Scala for Backend Engineering & Functional Programming-Lektion Code schreiben und ausführen?
Ja. Jede Scala for Backend Engineering & Functional Programming-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Case Classes
- Versiegelte Traits
- Algebraische Datentypen
- Vollständiges Matching