Composing Domains
Build larger models.
Building Larger Models
Real domains are assembled from smaller pieces. Composing domains means combining well-modeled ADTs, newtypes, and validated values into bigger, still-correct structures.
- Small, focused types compose into larger ones.
- Each piece keeps its own invariants.
case class Money(cents: Long)
case class Product(name: String, price: Money)
object Main:
def main(args: Array[String]): Unit =
println(Product("Book", Money(1999)))Nesting Products
Compose product types by nesting case classes. Each level adds structure while staying readable.
case class Address(city: String, zip: String)
case class Customer(name: String, address: Address)
object Main:
def main(args: Array[String]): Unit =
val c = Customer("Ada", Address("London", "E1"))
println(c.address.city)All lessons in this course
- Modeling with ADTs
- Smart Constructors
- Newtypes
- Composing Domains