Jesse A. Tov
1 The let-zl language
1.1 Syntax
1.2 Dynamic semantics
1.2.1 Errors
1.3 Static semantics
1.3.1 Type safety
1.3.1.1 Preservation
1.3.1.2 Progress
1.4 Termination
2 The simply-typed lambda calculus λ-st
2.1 Syntax
2.2 Dynamic semantics
2.3 Static semantics
2.3.1 Type safety
2.4 An extension
2.5 Normalization
2.6 Adding nontermination
3 λ-sub: subtyping with records
3.1 Syntax
3.2 Dynamic semantics
3.3 Static semantics
3.3.1 Subtyping
3.3.2 Type safety
3.4 Compiling with coercions
4 The polymorphic lambda calculus λ-2
4.1 Syntax
4.2 Dynamic semantics
4.3 Static semantics
4.4 Church data
4.4.1 Natural numbers
4.4.2 Booleans
4.4.3 Products
4.4.4 Sums
4.4.5 Lists
4.4.6 Existentials
5 The higher-order lambda calculus λ-ω
5.1 Syntax
5.2 Dynamic semantics
5.3 Static semantics
6 ML type inference
6.1 STLC revisited
6.1.1 Dynamic semantics
6.1.2 Static semantics
6.1.3 Adding a base type
6.1.4 Introducing let polymorphism
6.2 Type schemes in λ-ml
6.3 Statics
6.3.1 The logical type system
6.3.2 The syntax-directed type system
6.4 Type inference algorithm
6.4.1 Unification
6.4.2 Algorithm W
6.5 Constraint-based type inference
7 Qualified types
7.1 Syntax
7.2 Dynamic semantics
7.3 Static semantics
7.3.1 Syntax of types
7.3.2 The types of constants
7.3.3 Instantiation and entailment
7.3.4 Syntax-directed typing
7.4 Type inference algorithm
7.5 Evidence translation
8 The Lambda Cube: λ-cube
8.1 Syntax
8.2 Typing Rules