[Haskell-beginners] tail recursion optimizations and monads