Pure functional programming - type systems, monads, and lazy evaluation
Learn pure functional programming with Haskell