Learn functional programming from scratch with Haskell — from first expressions to custom types and typeclasses