Types and Programming Languages, in Haskell