Hi haskell-beginners,

I'm starting to come to the idea of exposing a Monad as a means of controlling an API.  So, I've started creating my own Monad data types based on classical monads.  However, I'm running into a problem regarding creating monad definitions when using nested Monads.

For example:

newtype Example m o = Example {
  runExample :: State Int (m o)
}

Is there a clean way to make Example a monad?

instance Monad m => Monad (Example m) where

  -- return is easy
  return = Example . return . return

  -- bind is hard.
  -- f :: o -> Example m p
  -- a :: Example m o 
  a >>= f = ...

My intuition tells me that this should be simple, I should just use the State's bind operation, but I can't seem to make it work.

Any advise would be great.


Thanks, Dave

--
David Hinkes