Algebraic data type ADT
Types built from "sum" (or) and "product" (and) — Rust enum, Haskell data, OCaml type. Enables pattern matching and exhaustive compile-time checking.
Product type = struct/tuple (contains A and B). Sum type = enum/union (contains A or B). Combine recursively: enum Tree { Leaf, Node(Tree, i32, Tree) }. Born of the ML/Haskell tradition, spread to Rust, Swift, Kotlin, TypeScript (via tagged unions), Scala 3. Critical for "make illegal states unrepresentable" design — if a user is either "Anonymous" or "LoggedIn { id, name }" the compile time can enforce you don't forget either case.