more free monad stuff, and split out haskell example