- Historical overview
- Imperative and decalarative programming
- Complexity
- The perils of mutable state
- Static and dynamic typing
- Abstraction
- Data representation
- Composition
- Relations vs. functions
- Introduction to Lambda calculus
- Binding and environments
- Pure functions: Expressions and statements
- Referential transparency
- Composition
- Higher-order functions
- Currying and partial application
- Recursion and tail call optimization
- Order of declarations and files
- Mutual recursion: types, functions and modules
- Pattern matching
- Active patterns
- Mutable variables
- Introduction to types
- Type systems and type checking
- Type inference
- The Curry-Howard isomorphism
- Existence as proof
- Algebraic data types
- OOP features
- Functors
- Applicative functors
- Monads
- Optics
- Types, classes and members
- Interfaces
- Constraints
- Stating intent
- Domain modeling
- Algebraic types as conjunction and disjunction
- Making invalid state unrepresentable
- Combinators
- HTML combinators
- Fable React
- Fable Elmish