🔴 Scala Advanced

How does Scala's pattern matching relate to algebraic data types (ADTs)?

Answer

Algebraic Data Types (ADTs) are a type system feature for modeling data with a fixed set of cases. Scala implements ADTs using sealed traits + case classes: sealed trait Expr; case class Num(n: Int) extends Expr; case class Add(l: Expr, r: Expr) extends Expr; case class Mul(l: Expr, r: Expr) extends Expr. Pattern matching deconstructs ADTs: def eval(e: Expr): Int = e match { case Num(n) => n; case Add(l, r) => eval(l) + eval(r); case Mul(l, r) => eval(l) * eval(r) }. The sealed keyword enables exhaustiveness checking — the compiler warns if a case is unhandled. This is the expression problem solved for closed sets of types. In Scala 3, the enum keyword provides first-class ADT support: enum Expr { case Num(n: Int); case Add(l: Expr, r: Expr) }. ADTs + pattern matching enable building interpreters, domain models, and state machines that are correct by construction.