Canonicalise Monad instances
authorhvr <hvr@gnu.org>
Tue, 24 Nov 2015 14:44:19 +0000 (14:44 +0000)
committerhvr <hvr@gnu.org>
Tue, 24 Nov 2015 14:44:19 +0000 (14:44 +0000)
This exploits the AMP by omitting the `return` definition
and makes the code future proof.
Moreover, this makes `transformers` warning-free under
GHC 8's new `-fwarn-noncanonical-monad-instances` warning.

14 files changed:
Control/Monad/Trans/Cont.hs
Control/Monad/Trans/Error.hs
Control/Monad/Trans/Except.hs
Control/Monad/Trans/Identity.hs
Control/Monad/Trans/List.hs
Control/Monad/Trans/Maybe.hs
Control/Monad/Trans/RWS/Lazy.hs
Control/Monad/Trans/RWS/Strict.hs
Control/Monad/Trans/Reader.hs
Control/Monad/Trans/State/Lazy.hs
Control/Monad/Trans/State/Strict.hs
Control/Monad/Trans/Writer/Lazy.hs
Control/Monad/Trans/Writer/Strict.hs
Data/Functor/Product.hs

index 081101c..4c68eaf 100644 (file)
@@ -148,7 +148,9 @@ instance Applicative (ContT r m) where
     f <*> v = ContT $ \ c -> runContT f $ \ g -> runContT v (c . g)
 
 instance Monad (ContT r m) where
+#if !(MIN_VERSION_base(4,8,0))
     return x = ContT ($ x)
+#endif
     m >>= k  = ContT $ \ c -> runContT m (\ x -> runContT (k x) c)
 
 instance MonadTrans (ContT r) where
index 1ecf27f..5b01586 100644 (file)
@@ -219,7 +219,9 @@ instance (Functor m, Monad m, Error e) => Alternative (ErrorT e m) where
     (<|>) = mplus
 
 instance (Monad m, Error e) => Monad (ErrorT e m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = ErrorT $ return (Right a)
+#endif
     m >>= k  = ErrorT $ do
         a <- runErrorT m
         case a of
index 65d41f8..2b68b98 100644 (file)
@@ -178,7 +178,9 @@ instance (Functor m, Monad m, Monoid e) => Alternative (ExceptT e m) where
             Right x -> return (Right x)
 
 instance (Monad m) => Monad (ExceptT e m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = ExceptT $ return (Right a)
+#endif
     m >>= k = ExceptT $ do
         a <- runExceptT m
         case a of
index ebd3aa8..238171e 100644 (file)
@@ -86,7 +86,9 @@ instance (Alternative m) => Alternative (IdentityT m) where
     (<|>) = lift2IdentityT (<|>)
 
 instance (Monad m) => Monad (IdentityT m) where
+#if !(MIN_VERSION_base(4,8,0))
     return = IdentityT . return
+#endif
     m >>= k = IdentityT $ runIdentityT . k =<< runIdentityT m
     fail msg = IdentityT $ fail msg
 
index 592c9a0..58dc1c2 100644 (file)
@@ -90,7 +90,9 @@ instance (Applicative m) => Alternative (ListT m) where
     m <|> n = ListT $ (++) <$> runListT m <*> runListT n
 
 instance (Monad m) => Monad (ListT m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = ListT $ return [a]
+#endif
     m >>= k  = ListT $ do
         a <- runListT m
         b <- mapM (runListT . k) a
index 197dfcf..c7e4bfb 100644 (file)
@@ -131,8 +131,10 @@ instance (Functor m, Monad m) => Alternative (MaybeT m) where
             Just _  -> return v
 
 instance (Monad m) => Monad (MaybeT m) where
-    fail _ = MaybeT (return Nothing)
+#if !(MIN_VERSION_base(4,8,0))
     return = lift . return
+#endif
+    fail _ = MaybeT (return Nothing)
     x >>= f = MaybeT $ do
         v <- runMaybeT x
         case v of
index f32dd2b..087c950 100644 (file)
@@ -175,7 +175,9 @@ instance (Monoid w, Functor m, MonadPlus m) => Alternative (RWST r w s m) where
     RWST m <|> RWST n = RWST $ \ r s -> m r s `mplus` n r s
 
 instance (Monoid w, Monad m) => Monad (RWST r w s m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = RWST $ \ _ s -> return (a, s, mempty)
+#endif
     m >>= k  = RWST $ \ r s -> do
         ~(a, s', w)  <- runRWST m r s
         ~(b, s'',w') <- runRWST (k a) r s'
index 514d8d4..b376f26 100644 (file)
@@ -175,7 +175,9 @@ instance (Monoid w, Functor m, MonadPlus m) => Alternative (RWST r w s m) where
     RWST m <|> RWST n = RWST $ \ r s -> m r s `mplus` n r s
 
 instance (Monoid w, Monad m) => Monad (RWST r w s m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = RWST $ \ _ s -> return (a, s, mempty)
+#endif
     m >>= k  = RWST $ \ r s -> do
         (a, s', w)  <- runRWST m r s
         (b, s'',w') <- runRWST (k a) r s'
index c47750a..f883f3b 100644 (file)
@@ -132,7 +132,9 @@ instance (Alternative m) => Alternative (ReaderT r m) where
     m <|> n = ReaderT $ \ r -> runReaderT m r <|> runReaderT n r
 
 instance (Monad m) => Monad (ReaderT r m) where
+#if !(MIN_VERSION_base(4,8,0))
     return   = lift . return
+#endif
     m >>= k  = ReaderT $ \ r -> do
         a <- runReaderT m r
         runReaderT (k a) r
index 460515b..4084988 100644 (file)
@@ -197,7 +197,9 @@ instance (Functor m, MonadPlus m) => Alternative (StateT s m) where
     StateT m <|> StateT n = StateT $ \ s -> m s `mplus` n s
 
 instance (Monad m) => Monad (StateT s m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = StateT $ \ s -> return (a, s)
+#endif
     m >>= k  = StateT $ \ s -> do
         ~(a, s') <- runStateT m s
         runStateT (k a) s'
index 639696b..ef42d48 100644 (file)
@@ -194,7 +194,9 @@ instance (Functor m, MonadPlus m) => Alternative (StateT s m) where
     StateT m <|> StateT n = StateT $ \ s -> m s `mplus` n s
 
 instance (Monad m) => Monad (StateT s m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = StateT $ \ s -> return (a, s)
+#endif
     m >>= k  = StateT $ \ s -> do
         (a, s') <- runStateT m s
         runStateT (k a) s'
index bbc371d..1342e32 100644 (file)
@@ -164,7 +164,9 @@ instance (Monoid w, Alternative m) => Alternative (WriterT w m) where
     m <|> n = WriterT $ runWriterT m <|> runWriterT n
 
 instance (Monoid w, Monad m) => Monad (WriterT w m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = writer (a, mempty)
+#endif
     m >>= k  = WriterT $ do
         ~(a, w)  <- runWriterT m
         ~(b, w') <- runWriterT (k a)
index 5281864..4d3a5dd 100644 (file)
@@ -167,7 +167,9 @@ instance (Monoid w, Alternative m) => Alternative (WriterT w m) where
     m <|> n = WriterT $ runWriterT m <|> runWriterT n
 
 instance (Monoid w, Monad m) => Monad (WriterT w m) where
+#if !(MIN_VERSION_base(4,8,0))
     return a = writer (a, mempty)
+#endif
     m >>= k  = WriterT $ do
         (a, w)  <- runWriterT m
         (b, w') <- runWriterT (k a)
index 4b7b0d0..db0899f 100644 (file)
@@ -81,7 +81,9 @@ instance (Alternative f, Alternative g) => Alternative (Product f g) where
     Pair x1 y1 <|> Pair x2 y2 = Pair (x1 <|> x2) (y1 <|> y2)
 
 instance (Monad f, Monad g) => Monad (Product f g) where
+#if !(MIN_VERSION_base(4,8,0))
     return x = Pair (return x) (return x)
+#endif
     Pair m n >>= f = Pair (m >>= fstP . f) (n >>= sndP . f)
       where
         fstP (Pair a _) = a