This is a compatibility fix for base-4.8. All MonadPlus definitions have Alternative as a prerequisite. Hence, instead of defining Alternative in terms of MonadPlus, we define MonadPlus in terms of Alternative.
Signed-off-by: Bhimanavajjula Aditya <b...@google.com> --- src/Ganeti/BasicTypes.hs | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/Ganeti/BasicTypes.hs b/src/Ganeti/BasicTypes.hs index 340aa41..0591fa3 100644 --- a/src/Ganeti/BasicTypes.hs +++ b/src/Ganeti/BasicTypes.hs @@ -128,13 +128,17 @@ instance Functor (GenericResult a) where fmap _ (Bad msg) = Bad msg fmap fn (Ok val) = Ok (fn val) -instance (Error a, Monoid a) => MonadPlus (GenericResult a) where - mzero = Bad $ strMsg "zero Result when used as MonadPlus" +instance (Error a, Monoid a) => Alternative (GenericResult a) where + empty = Bad $ strMsg "zero Result when used as empty" -- for mplus, when we 'add' two Bad values, we concatenate their -- error descriptions - (Bad x) `mplus` (Bad y) = Bad (x `mappend` strMsg "; " `mappend` y) - (Bad _) `mplus` x = x - x@(Ok _) `mplus` _ = x + (Bad x) <|> (Bad y) = Bad (x `mappend` strMsg "; " `mappend` y) + (Bad _) <|> x = x + x@(Ok _) <|> _ = x + +instance (Error a, Monoid a) => MonadPlus (GenericResult a) where + mzero = empty + mplus = (<|>) instance (Error a) => MonadError a (GenericResult a) where throwError = Bad @@ -148,10 +152,6 @@ instance Applicative (GenericResult a) where _ <*> (Bad x) = Bad x (Ok f) <*> (Ok x) = Ok $ f x -instance (Error a, Monoid a) => Alternative (GenericResult a) where - empty = mzero - (<|>) = mplus - -- | This is a monad transformation for Result. It's implementation is -- based on the implementations of MaybeT and ErrorT. -- @@ -238,17 +238,18 @@ instance (Error a, MonadBaseControl IO m) {-# INLINE liftBaseWith #-} {-# INLINE restoreM #-} -instance (Monad m, Error a, Monoid a) => MonadPlus (ResultT a m) where - mzero = ResultT $ return mzero +instance (Monad m, Error a, Monoid a) + => Alternative (ResultT a m) where + empty = ResultT $ return mzero -- Ensure that 'y' isn't run if 'x' contains a value. This makes it a bit -- more complicated than 'mplus' of 'GenericResult'. - mplus x y = elimResultT combine return x + x <|> y = elimResultT combine return x where combine x' = ResultT $ liftM (mplus (Bad x')) (runResultT y) -instance (Alternative m, Monad m, Error a, Monoid a) - => Alternative (ResultT a m) where - empty = mzero - (<|>) = mplus +instance (Monad m, Error a, Monoid a) + => MonadPlus (ResultT a m) where + mzero = empty + mplus = (<|>) -- | Changes the error message of a result value, if present. -- Note that since 'GenericResult' is also a 'MonadError', this function -- 2.5.0.457.gab17608