monads-fd 0.1.0.3 → 0.1.0.4
raw patch · 7 files changed
+560/−15 lines, 7 filesdep −mtldep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: mtl
Dependency ranges changed: base
API changes (from Hackage documentation)
+ Control.Monad.Cont.Class: instance (Error e, MonadCont m) => MonadCont (ErrorT e m)
+ Control.Monad.Cont.Class: instance (Monoid w, MonadCont m) => MonadCont (RWST r w s m)
+ Control.Monad.Cont.Class: instance (Monoid w, MonadCont m) => MonadCont (WriterT w m)
+ Control.Monad.Cont.Class: instance MonadCont (ContT r m)
+ Control.Monad.Cont.Class: instance MonadCont m => MonadCont (IdentityT m)
+ Control.Monad.Cont.Class: instance MonadCont m => MonadCont (ListT m)
+ Control.Monad.Cont.Class: instance MonadCont m => MonadCont (MaybeT m)
+ Control.Monad.Cont.Class: instance MonadCont m => MonadCont (ReaderT r m)
+ Control.Monad.Cont.Class: instance MonadCont m => MonadCont (StateT s m)
+ Control.Monad.Error.Class: instance (Monad m, Error e) => MonadError e (ErrorT e m)
+ Control.Monad.Error.Class: instance (Monoid w, MonadError e m) => MonadError e (RWST r w s m)
+ Control.Monad.Error.Class: instance (Monoid w, MonadError e m) => MonadError e (WriterT w m)
+ Control.Monad.Error.Class: instance Error e => MonadError e (Either e)
+ Control.Monad.Error.Class: instance MonadError IOException IO
+ Control.Monad.Error.Class: instance MonadError e m => MonadError e (IdentityT m)
+ Control.Monad.Error.Class: instance MonadError e m => MonadError e (ListT m)
+ Control.Monad.Error.Class: instance MonadError e m => MonadError e (MaybeT m)
+ Control.Monad.Error.Class: instance MonadError e m => MonadError e (ReaderT r m)
+ Control.Monad.Error.Class: instance MonadError e m => MonadError e (StateT s m)
+ Control.Monad.RWS.Class: instance (Error e, MonadRWS r w s m) => MonadRWS r w s (ErrorT e m)
+ Control.Monad.RWS.Class: instance (Monoid w, Monad m) => MonadRWS r w s (RWST r w s m)
+ Control.Monad.RWS.Class: instance MonadRWS r w s m => MonadRWS r w s (IdentityT m)
+ Control.Monad.RWS.Class: instance MonadRWS r w s m => MonadRWS r w s (MaybeT m)
+ Control.Monad.Reader.Class: instance (Error e, MonadReader r m) => MonadReader r (ErrorT e m)
+ Control.Monad.Reader.Class: instance (Monad m, Monoid w) => MonadReader r (RWST r w s m)
+ Control.Monad.Reader.Class: instance (Monoid w, MonadReader r m) => MonadReader r (WriterT w m)
+ Control.Monad.Reader.Class: instance Monad m => MonadReader r (ReaderT r m)
+ Control.Monad.Reader.Class: instance MonadReader r ((->) r)
+ Control.Monad.Reader.Class: instance MonadReader r m => MonadReader r (IdentityT m)
+ Control.Monad.Reader.Class: instance MonadReader r m => MonadReader r (ListT m)
+ Control.Monad.Reader.Class: instance MonadReader r m => MonadReader r (MaybeT m)
+ Control.Monad.Reader.Class: instance MonadReader r m => MonadReader r (StateT s m)
+ Control.Monad.Reader.Class: instance MonadReader r' m => MonadReader r' (ContT r m)
+ Control.Monad.State.Class: instance (Error e, MonadState s m) => MonadState s (ErrorT e m)
+ Control.Monad.State.Class: instance (Monad m, Monoid w) => MonadState s (RWST r w s m)
+ Control.Monad.State.Class: instance (Monoid w, MonadState s m) => MonadState s (WriterT w m)
+ Control.Monad.State.Class: instance Monad m => MonadState s (StateT s m)
+ Control.Monad.State.Class: instance MonadState s m => MonadState s (ContT r m)
+ Control.Monad.State.Class: instance MonadState s m => MonadState s (IdentityT m)
+ Control.Monad.State.Class: instance MonadState s m => MonadState s (ListT m)
+ Control.Monad.State.Class: instance MonadState s m => MonadState s (MaybeT m)
+ Control.Monad.State.Class: instance MonadState s m => MonadState s (ReaderT r m)
+ Control.Monad.Writer.Class: instance (Error e, MonadWriter w m) => MonadWriter w (ErrorT e m)
+ Control.Monad.Writer.Class: instance (Monoid w, Monad m) => MonadWriter w (RWST r w s m)
+ Control.Monad.Writer.Class: instance (Monoid w, Monad m) => MonadWriter w (WriterT w m)
+ Control.Monad.Writer.Class: instance MonadWriter w m => MonadWriter w (IdentityT m)
+ Control.Monad.Writer.Class: instance MonadWriter w m => MonadWriter w (MaybeT m)
+ Control.Monad.Writer.Class: instance MonadWriter w m => MonadWriter w (ReaderT r m)
+ Control.Monad.Writer.Class: instance MonadWriter w m => MonadWriter w (StateT s m)
- Control.Monad.Cont: callCC :: (MonadCont m) => ((a -> m b) -> m a) -> m a
+ Control.Monad.Cont: callCC :: MonadCont m => ((a -> m b) -> m a) -> m a
- Control.Monad.Cont: class (Monad m) => MonadCont m :: (* -> *)
+ Control.Monad.Cont: class Monad m => MonadCont m
- Control.Monad.Cont.Class: callCC :: (MonadCont m) => ((a -> m b) -> m a) -> m a
+ Control.Monad.Cont.Class: callCC :: MonadCont m => ((a -> m b) -> m a) -> m a
- Control.Monad.Cont.Class: class (Monad m) => MonadCont m :: (* -> *)
+ Control.Monad.Cont.Class: class Monad m => MonadCont m
- Control.Monad.Error: catchError :: (MonadError e m) => m a -> (e -> m a) -> m a
+ Control.Monad.Error: catchError :: MonadError e m => m a -> (e -> m a) -> m a
- Control.Monad.Error: class (Monad m) => MonadError e m :: (* -> *) | m -> e
+ Control.Monad.Error: class Monad m => MonadError e m | m -> e
- Control.Monad.Error: noMsg :: (Error a) => a
+ Control.Monad.Error: noMsg :: Error a => a
- Control.Monad.Error: strMsg :: (Error a) => String -> a
+ Control.Monad.Error: strMsg :: Error a => String -> a
- Control.Monad.Error: throwError :: (MonadError e m) => e -> m a
+ Control.Monad.Error: throwError :: MonadError e m => e -> m a
- Control.Monad.Error.Class: catchError :: (MonadError e m) => m a -> (e -> m a) -> m a
+ Control.Monad.Error.Class: catchError :: MonadError e m => m a -> (e -> m a) -> m a
- Control.Monad.Error.Class: class (Monad m) => MonadError e m :: (* -> *) | m -> e
+ Control.Monad.Error.Class: class Monad m => MonadError e m | m -> e
- Control.Monad.Error.Class: noMsg :: (Error a) => a
+ Control.Monad.Error.Class: noMsg :: Error a => a
- Control.Monad.Error.Class: strMsg :: (Error a) => String -> a
+ Control.Monad.Error.Class: strMsg :: Error a => String -> a
- Control.Monad.Error.Class: throwError :: (MonadError e m) => e -> m a
+ Control.Monad.Error.Class: throwError :: MonadError e m => e -> m a
- Control.Monad.RWS.Class: class (Monoid w, MonadReader r m, MonadWriter w m, MonadState s m) => MonadRWS r w s m :: (* -> *) | m -> r, m -> w, m -> s
+ Control.Monad.RWS.Class: class (Monoid w, MonadReader r m, MonadWriter w m, MonadState s m) => MonadRWS r w s m | m -> r, m -> w, m -> s
- Control.Monad.RWS.Lazy: evalRWST :: (Monad m) => RWST r w s m a -> r -> s -> m (a, w)
+ Control.Monad.RWS.Lazy: evalRWST :: Monad m => RWST r w s m a -> r -> s -> m (a, w)
- Control.Monad.RWS.Lazy: execRWST :: (Monad m) => RWST r w s m a -> r -> s -> m (s, w)
+ Control.Monad.RWS.Lazy: execRWST :: Monad m => RWST r w s m a -> r -> s -> m (s, w)
- Control.Monad.RWS.Strict: evalRWST :: (Monad m) => RWST r w s m a -> r -> s -> m (a, w)
+ Control.Monad.RWS.Strict: evalRWST :: Monad m => RWST r w s m a -> r -> s -> m (a, w)
- Control.Monad.RWS.Strict: execRWST :: (Monad m) => RWST r w s m a -> r -> s -> m (s, w)
+ Control.Monad.RWS.Strict: execRWST :: Monad m => RWST r w s m a -> r -> s -> m (s, w)
- Control.Monad.Reader: ask :: (MonadReader r m) => m r
+ Control.Monad.Reader: ask :: MonadReader r m => m r
- Control.Monad.Reader: asks :: (MonadReader r m) => (r -> a) -> m a
+ Control.Monad.Reader: asks :: MonadReader r m => (r -> a) -> m a
- Control.Monad.Reader: class (Monad m) => MonadReader r m :: (* -> *) | m -> r
+ Control.Monad.Reader: class Monad m => MonadReader r m | m -> r
- Control.Monad.Reader: local :: (MonadReader r m) => (r -> r) -> m a -> m a
+ Control.Monad.Reader: local :: MonadReader r m => (r -> r) -> m a -> m a
- Control.Monad.Reader.Class: ask :: (MonadReader r m) => m r
+ Control.Monad.Reader.Class: ask :: MonadReader r m => m r
- Control.Monad.Reader.Class: asks :: (MonadReader r m) => (r -> a) -> m a
+ Control.Monad.Reader.Class: asks :: MonadReader r m => (r -> a) -> m a
- Control.Monad.Reader.Class: class (Monad m) => MonadReader r m :: (* -> *) | m -> r
+ Control.Monad.Reader.Class: class Monad m => MonadReader r m | m -> r
- Control.Monad.Reader.Class: local :: (MonadReader r m) => (r -> r) -> m a -> m a
+ Control.Monad.Reader.Class: local :: MonadReader r m => (r -> r) -> m a -> m a
- Control.Monad.State.Class: class (Monad m) => MonadState s m :: (* -> *) | m -> s
+ Control.Monad.State.Class: class Monad m => MonadState s m | m -> s
- Control.Monad.State.Class: get :: (MonadState s m) => m s
+ Control.Monad.State.Class: get :: MonadState s m => m s
- Control.Monad.State.Class: gets :: (MonadState s m) => (s -> a) -> m a
+ Control.Monad.State.Class: gets :: MonadState s m => (s -> a) -> m a
- Control.Monad.State.Class: modify :: (MonadState s m) => (s -> s) -> m ()
+ Control.Monad.State.Class: modify :: MonadState s m => (s -> s) -> m ()
- Control.Monad.State.Class: put :: (MonadState s m) => s -> m ()
+ Control.Monad.State.Class: put :: MonadState s m => s -> m ()
- Control.Monad.State.Lazy: class (Monad m) => MonadState s m :: (* -> *) | m -> s
+ Control.Monad.State.Lazy: class Monad m => MonadState s m | m -> s
- Control.Monad.State.Lazy: evalStateT :: (Monad m) => StateT s m a -> s -> m a
+ Control.Monad.State.Lazy: evalStateT :: Monad m => StateT s m a -> s -> m a
- Control.Monad.State.Lazy: execStateT :: (Monad m) => StateT s m a -> s -> m s
+ Control.Monad.State.Lazy: execStateT :: Monad m => StateT s m a -> s -> m s
- Control.Monad.State.Lazy: get :: (MonadState s m) => m s
+ Control.Monad.State.Lazy: get :: MonadState s m => m s
- Control.Monad.State.Lazy: gets :: (MonadState s m) => (s -> a) -> m a
+ Control.Monad.State.Lazy: gets :: MonadState s m => (s -> a) -> m a
- Control.Monad.State.Lazy: modify :: (MonadState s m) => (s -> s) -> m ()
+ Control.Monad.State.Lazy: modify :: MonadState s m => (s -> s) -> m ()
- Control.Monad.State.Lazy: put :: (MonadState s m) => s -> m ()
+ Control.Monad.State.Lazy: put :: MonadState s m => s -> m ()
- Control.Monad.State.Strict: class (Monad m) => MonadState s m :: (* -> *) | m -> s
+ Control.Monad.State.Strict: class Monad m => MonadState s m | m -> s
- Control.Monad.State.Strict: evalStateT :: (Monad m) => StateT s m a -> s -> m a
+ Control.Monad.State.Strict: evalStateT :: Monad m => StateT s m a -> s -> m a
- Control.Monad.State.Strict: execStateT :: (Monad m) => StateT s m a -> s -> m s
+ Control.Monad.State.Strict: execStateT :: Monad m => StateT s m a -> s -> m s
- Control.Monad.State.Strict: get :: (MonadState s m) => m s
+ Control.Monad.State.Strict: get :: MonadState s m => m s
- Control.Monad.State.Strict: gets :: (MonadState s m) => (s -> a) -> m a
+ Control.Monad.State.Strict: gets :: MonadState s m => (s -> a) -> m a
- Control.Monad.State.Strict: modify :: (MonadState s m) => (s -> s) -> m ()
+ Control.Monad.State.Strict: modify :: MonadState s m => (s -> s) -> m ()
- Control.Monad.State.Strict: put :: (MonadState s m) => s -> m ()
+ Control.Monad.State.Strict: put :: MonadState s m => s -> m ()
- Control.Monad.Writer.Class: censor :: (MonadWriter w m) => (w -> w) -> m a -> m a
+ Control.Monad.Writer.Class: censor :: MonadWriter w m => (w -> w) -> m a -> m a
- Control.Monad.Writer.Class: class (Monoid w, Monad m) => MonadWriter w m :: (* -> *) | m -> w
+ Control.Monad.Writer.Class: class (Monoid w, Monad m) => MonadWriter w m | m -> w
- Control.Monad.Writer.Class: listen :: (MonadWriter w m) => m a -> m (a, w)
+ Control.Monad.Writer.Class: listen :: MonadWriter w m => m a -> m (a, w)
- Control.Monad.Writer.Class: listens :: (MonadWriter w m) => (w -> b) -> m a -> m (a, b)
+ Control.Monad.Writer.Class: listens :: MonadWriter w m => (w -> b) -> m a -> m (a, b)
- Control.Monad.Writer.Class: pass :: (MonadWriter w m) => m (a, w -> w) -> m a
+ Control.Monad.Writer.Class: pass :: MonadWriter w m => m (a, w -> w) -> m a
- Control.Monad.Writer.Class: tell :: (MonadWriter w m) => w -> m ()
+ Control.Monad.Writer.Class: tell :: MonadWriter w m => w -> m ()
- Control.Monad.Writer.Lazy: censor :: (MonadWriter w m) => (w -> w) -> m a -> m a
+ Control.Monad.Writer.Lazy: censor :: MonadWriter w m => (w -> w) -> m a -> m a
- Control.Monad.Writer.Lazy: class (Monoid w, Monad m) => MonadWriter w m :: (* -> *) | m -> w
+ Control.Monad.Writer.Lazy: class (Monoid w, Monad m) => MonadWriter w m | m -> w
- Control.Monad.Writer.Lazy: execWriterT :: (Monad m) => WriterT w m a -> m w
+ Control.Monad.Writer.Lazy: execWriterT :: Monad m => WriterT w m a -> m w
- Control.Monad.Writer.Lazy: listen :: (MonadWriter w m) => m a -> m (a, w)
+ Control.Monad.Writer.Lazy: listen :: MonadWriter w m => m a -> m (a, w)
- Control.Monad.Writer.Lazy: listens :: (MonadWriter w m) => (w -> b) -> m a -> m (a, b)
+ Control.Monad.Writer.Lazy: listens :: MonadWriter w m => (w -> b) -> m a -> m (a, b)
- Control.Monad.Writer.Lazy: pass :: (MonadWriter w m) => m (a, w -> w) -> m a
+ Control.Monad.Writer.Lazy: pass :: MonadWriter w m => m (a, w -> w) -> m a
- Control.Monad.Writer.Lazy: tell :: (MonadWriter w m) => w -> m ()
+ Control.Monad.Writer.Lazy: tell :: MonadWriter w m => w -> m ()
- Control.Monad.Writer.Strict: censor :: (MonadWriter w m) => (w -> w) -> m a -> m a
+ Control.Monad.Writer.Strict: censor :: MonadWriter w m => (w -> w) -> m a -> m a
- Control.Monad.Writer.Strict: class (Monoid w, Monad m) => MonadWriter w m :: (* -> *) | m -> w
+ Control.Monad.Writer.Strict: class (Monoid w, Monad m) => MonadWriter w m | m -> w
- Control.Monad.Writer.Strict: execWriterT :: (Monad m) => WriterT w m a -> m w
+ Control.Monad.Writer.Strict: execWriterT :: Monad m => WriterT w m a -> m w
- Control.Monad.Writer.Strict: listen :: (MonadWriter w m) => m a -> m (a, w)
+ Control.Monad.Writer.Strict: listen :: MonadWriter w m => m a -> m (a, w)
- Control.Monad.Writer.Strict: listens :: (MonadWriter w m) => (w -> b) -> m a -> m (a, b)
+ Control.Monad.Writer.Strict: listens :: MonadWriter w m => (w -> b) -> m a -> m (a, b)
- Control.Monad.Writer.Strict: pass :: (MonadWriter w m) => m (a, w -> w) -> m a
+ Control.Monad.Writer.Strict: pass :: MonadWriter w m => m (a, w -> w) -> m a
- Control.Monad.Writer.Strict: tell :: (MonadWriter w m) => w -> m ()
+ Control.Monad.Writer.Strict: tell :: MonadWriter w m => w -> m ()
Files
- Control/Monad/Cont/Class.hs +76/−1
- Control/Monad/Error/Class.hs +113/−1
- Control/Monad/RWS/Class.hs +30/−4
- Control/Monad/Reader/Class.hs +104/−1
- Control/Monad/State/Class.hs +106/−1
- Control/Monad/Writer/Class.hs +119/−1
- monads-fd.cabal +12/−6
Control/Monad/Cont/Class.hs view
@@ -52,4 +52,79 @@ MonadCont(..), ) where -import "mtl" Control.Monad.Cont.Class+import Control.Monad.Trans.Cont (ContT)+import qualified Control.Monad.Trans.Cont as ContT+import Control.Monad.Trans.Error as Error+import Control.Monad.Trans.Identity as Identity+import Control.Monad.Trans.List as List+import Control.Monad.Trans.Maybe as Maybe+import Control.Monad.Trans.Reader as Reader+import Control.Monad.Trans.RWS.Lazy as LazyRWS+import Control.Monad.Trans.RWS.Strict as StrictRWS+import Control.Monad.Trans.State.Lazy as LazyState+import Control.Monad.Trans.State.Strict as StrictState+import Control.Monad.Trans.Writer.Lazy as LazyWriter+import Control.Monad.Trans.Writer.Strict as StrictWriter++import Control.Monad+import Data.Monoid++class (Monad m) => MonadCont m where+ {- | @callCC@ (call-with-current-continuation)+ calls a function with the current continuation as its argument.+ Provides an escape continuation mechanism for use with Continuation monads.+ Escape continuations allow to abort the current computation and return+ a value immediately.+ They achieve a similar effect to 'Control.Monad.Error.throwError'+ and 'Control.Monad.Error.catchError'+ within an 'Control.Monad.Error.Error' monad.+ Advantage of this function over calling @return@ is that it makes+ the continuation explicit,+ allowing more flexibility and better control+ (see examples in "Control.Monad.Cont").++ The standard idiom used with @callCC@ is to provide a lambda-expression+ to name the continuation. Then calling the named continuation anywhere+ within its scope will escape from the computation,+ even if it is many layers deep within nested computations.+ -}+ callCC :: ((a -> m b) -> m a) -> m a++instance MonadCont (ContT r m) where+ callCC = ContT.callCC++-- ---------------------------------------------------------------------------+-- Instances for other mtl transformers++instance (Error e, MonadCont m) => MonadCont (ErrorT e m) where+ callCC = Error.liftCallCC callCC++instance (MonadCont m) => MonadCont (IdentityT m) where+ callCC = Identity.liftCallCC callCC++instance (MonadCont m) => MonadCont (ListT m) where+ callCC = List.liftCallCC callCC++instance (MonadCont m) => MonadCont (MaybeT m) where+ callCC = Maybe.liftCallCC callCC++instance (MonadCont m) => MonadCont (ReaderT r m) where+ callCC = Reader.liftCallCC callCC++instance (Monoid w, MonadCont m) => MonadCont (LazyRWS.RWST r w s m) where+ callCC = LazyRWS.liftCallCC' callCC++instance (Monoid w, MonadCont m) => MonadCont (StrictRWS.RWST r w s m) where+ callCC = StrictRWS.liftCallCC' callCC++instance (MonadCont m) => MonadCont (LazyState.StateT s m) where+ callCC = LazyState.liftCallCC' callCC++instance (MonadCont m) => MonadCont (StrictState.StateT s m) where+ callCC = StrictState.liftCallCC' callCC++instance (Monoid w, MonadCont m) => MonadCont (LazyWriter.WriterT w m) where+ callCC = LazyWriter.liftCallCC callCC++instance (Monoid w, MonadCont m) => MonadCont (StrictWriter.WriterT w m) where+ callCC = StrictWriter.liftCallCC callCC
Control/Monad/Error/Class.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE UndecidableInstances #-}+ {- | Module : Control.Monad.Error.Class Copyright : (c) Michael Weber <michael.weber@post.rwth-aachen.de> 2001,@@ -36,4 +38,114 @@ MonadError(..), ) where -import "mtl" Control.Monad.Error.Class+import Control.Monad.Trans.Error (Error(..), ErrorT)+import qualified Control.Monad.Trans.Error as ErrorT (throwError, catchError)+import Control.Monad.Trans.Identity as Identity+import Control.Monad.Trans.List as List+import Control.Monad.Trans.Maybe as Maybe+import Control.Monad.Trans.Reader as Reader+import Control.Monad.Trans.RWS.Lazy as LazyRWS+import Control.Monad.Trans.RWS.Strict as StrictRWS+import Control.Monad.Trans.State.Lazy as LazyState+import Control.Monad.Trans.State.Strict as StrictState+import Control.Monad.Trans.Writer.Lazy as LazyWriter+import Control.Monad.Trans.Writer.Strict as StrictWriter++import Control.Monad.Trans.Class (lift)+import Control.Exception (IOException)+import Control.Monad+import Control.Monad.Instances ()+import Data.Monoid++{- |+The strategy of combining computations that can throw exceptions+by bypassing bound functions+from the point an exception is thrown to the point that it is handled.++Is parameterized over the type of error information and+the monad type constructor.+It is common to use @'Data.Either' String@ as the monad type constructor+for an error monad in which error descriptions take the form of strings.+In that case and many other common cases the resulting monad is already defined+as an instance of the 'MonadError' class.+You can also define your own error type and\/or use a monad type constructor+other than @'Either' 'String'@ or @'Either' 'IOError'@.+In these cases you will have to explicitly define instances of the 'Error'+and\/or 'MonadError' classes.+-}+class (Monad m) => MonadError e m | m -> e where+ -- | Is used within a monadic computation to begin exception processing.+ throwError :: e -> m a++ {- |+ A handler function to handle previous errors and return to normal execution.+ A common idiom is:++ > do { action1; action2; action3 } `catchError` handler++ where the @action@ functions can call 'throwError'.+ Note that @handler@ and the do-block must have the same return type.+ -}+ catchError :: m a -> (e -> m a) -> m a++instance MonadError IOException IO where+ throwError = ioError+ catchError = catch++-- ---------------------------------------------------------------------------+-- Our parameterizable error monad++instance (Error e) => MonadError e (Either e) where+ throwError = Left+ Left l `catchError` h = h l+ Right r `catchError` _ = Right r++instance (Monad m, Error e) => MonadError e (ErrorT e m) where+ throwError = ErrorT.throwError+ catchError = ErrorT.catchError++-- ---------------------------------------------------------------------------+-- Instances for other mtl transformers+--+-- All of these instances need UndecidableInstances,+-- because they do not satisfy the coverage condition.++instance (MonadError e m) => MonadError e (IdentityT m) where+ throwError = lift . throwError+ catchError = Identity.liftCatch catchError++instance (MonadError e m) => MonadError e (ListT m) where+ throwError = lift . throwError+ catchError = List.liftCatch catchError++instance (MonadError e m) => MonadError e (MaybeT m) where+ throwError = lift . throwError+ catchError = Maybe.liftCatch catchError++instance (MonadError e m) => MonadError e (ReaderT r m) where+ throwError = lift . throwError+ catchError = Reader.liftCatch catchError++instance (Monoid w, MonadError e m) => MonadError e (LazyRWS.RWST r w s m) where+ throwError = lift . throwError+ catchError = LazyRWS.liftCatch catchError++instance (Monoid w, MonadError e m) => MonadError e (StrictRWS.RWST r w s m) where+ throwError = lift . throwError+ catchError = StrictRWS.liftCatch catchError++instance (MonadError e m) => MonadError e (LazyState.StateT s m) where+ throwError = lift . throwError+ catchError = LazyState.liftCatch catchError++instance (MonadError e m) => MonadError e (StrictState.StateT s m) where+ throwError = lift . throwError+ catchError = StrictState.liftCatch catchError++instance (Monoid w, MonadError e m) => MonadError e (LazyWriter.WriterT w m) where+ throwError = lift . throwError+ catchError = LazyWriter.liftCatch catchError++instance (Monoid w, MonadError e m) => MonadError e (StrictWriter.WriterT w m) where+ throwError = lift . throwError+ catchError = StrictWriter.liftCatch catchError
Control/Monad/RWS/Class.hs view
@@ -1,3 +1,6 @@+{-# LANGUAGE UndecidableInstances #-}+-- Search for UndecidableInstances to see why this is needed+ ----------------------------------------------------------------------------- -- | -- Module : Control.Monad.RWS.Class@@ -25,7 +28,30 @@ module Control.Monad.Writer.Class, ) where -import "mtl" Control.Monad.RWS.Class-import "mtl" Control.Monad.Reader.Class-import "mtl" Control.Monad.State.Class-import "mtl" Control.Monad.Writer.Class+import Control.Monad.Reader.Class+import Control.Monad.State.Class+import Control.Monad.Writer.Class++import Control.Monad.Trans.Error(Error, ErrorT)+import Control.Monad.Trans.Maybe(MaybeT)+import Control.Monad.Trans.Identity(IdentityT)+import Control.Monad.Trans.RWS.Lazy as Lazy (RWST)+import qualified Control.Monad.Trans.RWS.Strict as Strict (RWST)++import Data.Monoid++class (Monoid w, MonadReader r m, MonadWriter w m, MonadState s m)+ => MonadRWS r w s m | m -> r, m -> w, m -> s++instance (Monoid w, Monad m) => MonadRWS r w s (Lazy.RWST r w s m)+instance (Monoid w, Monad m) => MonadRWS r w s (Strict.RWST r w s m)+ +---------------------------------------------------------------------------+-- Instances for other mtl transformers+--+-- All of these instances need UndecidableInstances,+-- because they do not satisfy the coverage condition.+ +instance (Error e, MonadRWS r w s m) => MonadRWS r w s (ErrorT e m)+instance (MonadRWS r w s m) => MonadRWS r w s (IdentityT m)+instance (MonadRWS r w s m) => MonadRWS r w s (MaybeT m)
Control/Monad/Reader/Class.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE UndecidableInstances #-}+-- Search for UndecidableInstances to see why this is needed {- | Module : Control.Monad.Reader.Class Copyright : (c) Andy Gill 2001,@@ -41,4 +43,105 @@ asks, ) where -import "mtl" Control.Monad.Reader.Class+import Control.Monad.Trans.Cont as Cont+import Control.Monad.Trans.Error+import Control.Monad.Trans.Identity+import Control.Monad.Trans.List+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Reader (ReaderT)+import qualified Control.Monad.Trans.Reader as ReaderT (ask, local)+import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS (RWST, ask, local)+import qualified Control.Monad.Trans.RWS.Strict as StrictRWS (RWST, ask, local)+import Control.Monad.Trans.State.Lazy as Lazy+import Control.Monad.Trans.State.Strict as Strict+import Control.Monad.Trans.Writer.Lazy as Lazy+import Control.Monad.Trans.Writer.Strict as Strict++import Control.Monad.Trans.Class (lift)+import Control.Monad+import Data.Monoid++-- ----------------------------------------------------------------------------+-- class MonadReader+-- asks for the internal (non-mutable) state.++-- | See examples in "Control.Monad.Reader".+-- Note, the partially applied function type @(->) r@ is a simple reader monad.+-- See the @instance@ declaration below.+class (Monad m) => MonadReader r m | m -> r where+ -- | Retrieves the monad environment.+ ask :: m r++ -- | Executes a computation in a modified environment.+ local :: (r -> r) -- ^ The function to modify the environment.+ -> m a -- ^ @Reader@ to run in the modified environment.+ -> m a++-- | Retrieves a function of the current environment.+asks :: (MonadReader r m)+ => (r -> a) -- ^ The selector function to apply to the environment.+ -> m a+asks f = do+ r <- ask+ return (f r)++-- ----------------------------------------------------------------------------+-- The partially applied function type is a simple reader monad++instance MonadReader r ((->) r) where+ ask = id+ local f m = m . f++instance (Monad m) => MonadReader r (ReaderT r m) where+ ask = ReaderT.ask+ local = ReaderT.local++instance (Monad m, Monoid w) => MonadReader r (LazyRWS.RWST r w s m) where+ ask = LazyRWS.ask+ local = LazyRWS.local++instance (Monad m, Monoid w) => MonadReader r (StrictRWS.RWST r w s m) where+ ask = StrictRWS.ask+ local = StrictRWS.local++-- ---------------------------------------------------------------------------+-- Instances for other mtl transformers+--+-- All of these instances need UndecidableInstances,+-- because they do not satisfy the coverage condition.++instance (MonadReader r' m) => MonadReader r' (ContT r m) where+ ask = lift ask+ local = Cont.liftLocal ask local++instance (Error e, MonadReader r m) => MonadReader r (ErrorT e m) where+ ask = lift ask+ local = mapErrorT . local++instance (MonadReader r m) => MonadReader r (IdentityT m) where+ ask = lift ask+ local = mapIdentityT . local++instance (MonadReader r m) => MonadReader r (ListT m) where+ ask = lift ask+ local = mapListT . local++instance (MonadReader r m) => MonadReader r (MaybeT m) where+ ask = lift ask+ local = mapMaybeT . local++instance (MonadReader r m) => MonadReader r (Lazy.StateT s m) where+ ask = lift ask+ local = Lazy.mapStateT . local++instance (MonadReader r m) => MonadReader r (Strict.StateT s m) where+ ask = lift ask+ local = Strict.mapStateT . local++instance (Monoid w, MonadReader r m) => MonadReader r (Lazy.WriterT w m) where+ ask = lift ask+ local = Lazy.mapWriterT . local++instance (Monoid w, MonadReader r m) => MonadReader r (Strict.WriterT w m) where+ ask = lift ask+ local = Strict.mapWriterT . local
Control/Monad/State/Class.hs view
@@ -1,3 +1,6 @@+{-# LANGUAGE UndecidableInstances #-}+-- Search for UndecidableInstances to see why this is needed+ ----------------------------------------------------------------------------- -- | -- Module : Control.Monad.State.Class@@ -25,4 +28,106 @@ gets, ) where -import "mtl" Control.Monad.State.Class+import Control.Monad.Trans.Cont+import Control.Monad.Trans.Error+import Control.Monad.Trans.Identity+import Control.Monad.Trans.List+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Reader+import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS (RWST, get, put)+import qualified Control.Monad.Trans.RWS.Strict as StrictRWS (RWST, get, put)+import qualified Control.Monad.Trans.State.Lazy as Lazy (StateT, get, put)+import qualified Control.Monad.Trans.State.Strict as Strict (StateT, get, put)+import Control.Monad.Trans.Writer.Lazy as Lazy+import Control.Monad.Trans.Writer.Strict as Strict++import Control.Monad.Trans.Class (lift)+import Control.Monad+import Data.Monoid++-- ---------------------------------------------------------------------------++class (Monad m) => MonadState s m | m -> s where+ -- | Return the state from the internals of the monad.+ get :: m s+ -- | Replace the state inside the monad.+ put :: s -> m ()++-- | Monadic state transformer.+--+-- Maps an old state to a new state inside a state monad.+-- The old state is thrown away.+--+-- > Main> :t modify ((+1) :: Int -> Int)+-- > modify (...) :: (MonadState Int a) => a ()+--+-- This says that @modify (+1)@ acts over any+-- Monad that is a member of the @MonadState@ class,+-- with an @Int@ state.++modify :: (MonadState s m) => (s -> s) -> m ()+modify f = do+ s <- get+ put (f s)++-- | Gets specific component of the state, using a projection function+-- supplied.++gets :: (MonadState s m) => (s -> a) -> m a+gets f = do+ s <- get+ return (f s)++instance (Monad m) => MonadState s (Lazy.StateT s m) where+ get = Lazy.get+ put = Lazy.put++instance (Monad m) => MonadState s (Strict.StateT s m) where+ get = Strict.get+ put = Strict.put++instance (Monad m, Monoid w) => MonadState s (LazyRWS.RWST r w s m) where+ get = LazyRWS.get+ put = LazyRWS.put++instance (Monad m, Monoid w) => MonadState s (StrictRWS.RWST r w s m) where+ get = StrictRWS.get+ put = StrictRWS.put++-- ---------------------------------------------------------------------------+-- Instances for other mtl transformers+--+-- All of these instances need UndecidableInstances,+-- because they do not satisfy the coverage condition.++instance (MonadState s m) => MonadState s (ContT r m) where+ get = lift get+ put = lift . put++instance (Error e, MonadState s m) => MonadState s (ErrorT e m) where+ get = lift get+ put = lift . put++instance (MonadState s m) => MonadState s (IdentityT m) where+ get = lift get+ put = lift . put++instance (MonadState s m) => MonadState s (ListT m) where+ get = lift get+ put = lift . put++instance (MonadState s m) => MonadState s (MaybeT m) where+ get = lift get+ put = lift . put++instance (MonadState s m) => MonadState s (ReaderT r m) where+ get = lift get+ put = lift . put++instance (Monoid w, MonadState s m) => MonadState s (Lazy.WriterT w m) where+ get = lift get+ put = lift . put++instance (Monoid w, MonadState s m) => MonadState s (Strict.WriterT w m) where+ get = lift get+ put = lift . put
Control/Monad/Writer/Class.hs view
@@ -1,3 +1,6 @@+{-# LANGUAGE UndecidableInstances #-}+-- Search for UndecidableInstances to see why this is needed+ ----------------------------------------------------------------------------- -- | -- Module : Control.Monad.Writer.Class@@ -24,4 +27,119 @@ censor, ) where -import "mtl" Control.Monad.Writer.Class+import Control.Monad.Trans.Error as Error+import Control.Monad.Trans.Identity as Identity+import Control.Monad.Trans.Maybe as Maybe+import Control.Monad.Trans.Reader+import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS (+ RWST, tell, listen, pass)+import qualified Control.Monad.Trans.RWS.Strict as StrictRWS (+ RWST, tell, listen, pass)+import Control.Monad.Trans.State.Lazy as Lazy+import Control.Monad.Trans.State.Strict as Strict+import qualified Control.Monad.Trans.Writer.Lazy as Lazy (+ WriterT, tell, listen, pass)+import qualified Control.Monad.Trans.Writer.Strict as Strict (+ WriterT, tell, listen, pass)++import Control.Monad.Trans.Class (lift)+import Control.Monad+import Data.Monoid++-- ---------------------------------------------------------------------------+-- MonadWriter class+--+-- tell is like tell on the MUD's it shouts to monad+-- what you want to be heard. The monad carries this 'packet'+-- upwards, merging it if needed (hence the Monoid requirement).+--+-- listen listens to a monad acting, and returns what the monad "said".+--+-- pass lets you provide a writer transformer which changes internals of+-- the written object.++class (Monoid w, Monad m) => MonadWriter w m | m -> w where+ -- | @'tell' w@ is an action that produces the output @w@.+ tell :: w -> m ()+ -- | @'listen' m@ is an action that executes the action @m@ and adds+ -- its output to the value of the computation.+ listen :: m a -> m (a, w)+ -- | @'pass' m@ is an action that executes the action @m@, which+ -- returns a value and a function, and returns the value, applying+ -- the function to the output.+ pass :: m (a, w -> w) -> m a++-- | @'listens' f m@ is an action that executes the action @m@ and adds+-- the result of applying @f@ to the output to the value of the computation.+--+-- * @'listens' f m = 'liftM' (id *** f) ('listen' m)@+listens :: (MonadWriter w m) => (w -> b) -> m a -> m (a, b)+listens f m = do+ ~(a, w) <- listen m+ return (a, f w)++-- | @'censor' f m@ is an action that executes the action @m@ and+-- applies the function @f@ to its output, leaving the return value+-- unchanged.+--+-- * @'censor' f m = 'pass' ('liftM' (\\x -> (x,f)) m)@+censor :: (MonadWriter w m) => (w -> w) -> m a -> m a+censor f m = pass $ do+ a <- m+ return (a, f)++instance (Monoid w, Monad m) => MonadWriter w (Lazy.WriterT w m) where+ tell = Lazy.tell+ listen = Lazy.listen+ pass = Lazy.pass++instance (Monoid w, Monad m) => MonadWriter w (Strict.WriterT w m) where+ tell = Strict.tell+ listen = Strict.listen+ pass = Strict.pass++instance (Monoid w, Monad m) => MonadWriter w (LazyRWS.RWST r w s m) where+ tell = LazyRWS.tell+ listen = LazyRWS.listen+ pass = LazyRWS.pass++instance (Monoid w, Monad m) => MonadWriter w (StrictRWS.RWST r w s m) where+ tell = StrictRWS.tell+ listen = StrictRWS.listen+ pass = StrictRWS.pass++-- ---------------------------------------------------------------------------+-- Instances for other mtl transformers+--+-- All of these instances need UndecidableInstances,+-- because they do not satisfy the coverage condition.++instance (Error e, MonadWriter w m) => MonadWriter w (ErrorT e m) where+ tell = lift . tell+ listen = Error.liftListen listen+ pass = Error.liftPass pass++instance (MonadWriter w m) => MonadWriter w (IdentityT m) where+ tell = lift . tell+ listen = Identity.mapIdentityT listen+ pass = Identity.mapIdentityT pass++instance (MonadWriter w m) => MonadWriter w (MaybeT m) where+ tell = lift . tell+ listen = Maybe.liftListen listen+ pass = Maybe.liftPass pass++instance (MonadWriter w m) => MonadWriter w (ReaderT r m) where+ tell = lift . tell+ listen = mapReaderT listen+ pass = mapReaderT pass++instance (MonadWriter w m) => MonadWriter w (Lazy.StateT s m) where+ tell = lift . tell+ listen = Lazy.liftListen listen+ pass = Lazy.liftPass pass++instance (MonadWriter w m) => MonadWriter w (Strict.StateT s m) where+ tell = lift . tell+ listen = Strict.liftListen listen+ pass = Strict.liftPass pass
monads-fd.cabal view
@@ -1,5 +1,5 @@ name: monads-fd-version: 0.1.0.3+version: 0.1.0.4 cabal-version: >= 1.6 license: BSD3 license-file: LICENSE@@ -8,9 +8,13 @@ category: Control synopsis: Monad classes, using functional dependencies description:- Now that @mtl@ has been upgraded to depend on @transformers@,- this package is a backwards compatibility stub re-exporting the- @mtl@ package.+ Monad classes using functional dependencies, with instances+ for various monad transformers, inspired by the paper+ /Functional Programming with Overloading and Higher-Order Polymorphism/,+ by Mark P Jones, in /Advanced School of Functional Programming/, 1995+ (<http://web.cecs.pdx.edu/~mpj/pubs/springschool.html>).+ .+ This package is almost a compatible replacement for the @mtl@ package. build-type: Simple Library@@ -36,6 +40,8 @@ Control.Monad.Writer.Class Control.Monad.Writer.Lazy Control.Monad.Writer.Strict- build-depends: base < 6, transformers == 0.2.*, mtl == 2.*+ build-depends: base < 6, transformers == 0.2.* extensions:- PackageImports+ MultiParamTypeClasses+ FunctionalDependencies+ FlexibleInstances