introduction to functional programming using haskell