OK, I think we have enough agreement to decide:

        class Monad m where
          return :: m a
          (>>=)  :: m a -> (a -> m b) -> m b
          (>>)   :: m a -> m b -> m b

          fail :: String -> m a

          fail s = error s

(I'm still a bit nervous about capturing 'fail' but
there seems to be fairly strong support for doing so.)


        class Monad m => MonadPlus m where
          mzero :: m a
          mplus :: m a -> m a -> m a


        IO.fail becomes IO.ioError

Simon


Reply via email to