Haskell Programming from first principles