The course is divided into three separate modules, each covering different aspects on types, semantics, and programming language theory:
1. Operational semantics and the lambda calculus
- Small-step and big-step operational semantics
- Untyped lambda calculus
- Fundamental typed functional programming
2. Typed lambda calculus with extensions
- Type rules
- Type soundness proofs
- Semantics for let bindings, pairs, tuples, records, sums, and lists
- References and exceptions
3. Subtyping and Polymorphism
- Subtype polymorphism
- Parametric polymorphism
- Ad-hoc polymorphism
- Structural and nominal type systems
- Gradual typing