{-# LANGUAGE Safe #-}{-# LANGUAGE FlexibleInstances #-}{-# LANGUAGE FunctionalDependencies #-}{-# LANGUAGE MultiParamTypeClasses #-}-- Search for UndecidableInstances to see why this is needed{-# LANGUAGE UndecidableInstances #-}-- Needed because the CPSed versions of Writer and State are secretly State-- wrappers, which don't force such constraints, even though they should legally-- be there.{-# OPTIONS_GHC -Wno-redundant-constraints #-}{- |
Module : Control.Monad.Reader.Class
Copyright : (c) Andy Gill 2001,
 (c) Oregon Graduate Institute of Science and Technology 2001,
 (c) Jeff Newbern 2003-2007,
 (c) Andriy Palamarchuk 2007
License : BSD-style (see the file LICENSE)
Maintainer : libraries@haskell.org
Stability : experimental
Portability : non-portable (multi-param classes, functional dependencies)
[Computation type:] Computations which read values from a shared environment.
[Binding strategy:] Monad values are functions from the environment to a value.
The bound function is applied to the bound value, and both have access
to the shared environment.
[Useful for:] Maintaining variable bindings, or other shared environment.
[Zero and plus:] None.
[Example type:] @'Reader' [(String,Value)] a@
The 'Reader' monad (also called the Environment monad).
Represents a computation, which can read values from
a shared environment, pass values from function to function,
and execute sub-computations in a modified environment.
Using 'Reader' monad for such computations is often clearer and easier
than using the 'Control.Monad.State.State' monad.
 Inspired by the paper
 /Functional Programming with Overloading and Higher-Order Polymorphism/,
 Mark P Jones (<http://web.cecs.pdx.edu/~mpj/>)
 Advanced School of Functional Programming, 1995.
-}moduleControl.Monad.Reader.Class(MonadReader (..),asks ,)whereimportqualifiedControl.Monad.Trans.ContasContimportControl.Monad.Trans.Cont(ContT)importControl.Monad.Trans.Except(ExceptT,mapExceptT)importControl.Monad.Trans.Identity(IdentityT,mapIdentityT)importControl.Monad.Trans.Maybe(MaybeT,mapMaybeT)importControl.Monad.Trans.Reader(ReaderT)importqualifiedControl.Monad.Trans.ReaderasReaderTimportqualifiedControl.Monad.Trans.RWS.LazyasLazyRWSimportqualifiedControl.Monad.Trans.RWS.StrictasStrictRWSimportqualifiedControl.Monad.Trans.State.LazyasLazyimportqualifiedControl.Monad.Trans.State.StrictasStrictimportqualifiedControl.Monad.Trans.Writer.LazyasLazyimportqualifiedControl.Monad.Trans.Writer.StrictasStrictimportControl.Monad.Trans.Accum(AccumT)importqualifiedControl.Monad.Trans.AccumasAccumimportControl.Monad.Trans.Select(SelectT(SelectT),runSelectT)importqualifiedControl.Monad.Trans.RWS.CPSasCPSRWSimportqualifiedControl.Monad.Trans.Writer.CPSasCPSimportControl.Monad.Trans.Class(lift)-- ------------------------------------------------------------------------------ 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.classMonadm =>MonadReader r m |m ->r where{-# MINIMAL(ask |reader ),local #-}-- | Retrieves the monad environment.ask ::m r ask =forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader forall a. a -> a
id-- | 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.reader ::(r ->a )-- ^ The selector function to apply to the environment.->m a reader r -> a
f =dor
r <-forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a. Monad m => a -> m a
return(r -> a
f r
r )-- | Retrieves a function of the current environment.asks ::MonadReader r m =>(r ->a )-- ^ The selector function to apply to the environment.->m a asks :: forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks =forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader -- ------------------------------------------------------------------------------ The partially applied function type is a simple reader monadinstanceMonadReader r ((->)r )whereask :: r -> r
ask =forall a. a -> a
idlocal :: forall a. (r -> r) -> (r -> a) -> r -> a
local r -> r
f r -> a
m =r -> a
m forall b c a. (b -> c) -> (a -> b) -> a -> c
.r -> r
f reader :: forall a. (r -> a) -> r -> a
reader =forall a. a -> a
idinstanceMonadm =>MonadReader r (ReaderTr m )whereask :: ReaderT r m r
ask =forall (m :: * -> *) r. Monad m => ReaderT r m r
ReaderT.asklocal :: forall a. (r -> r) -> ReaderT r m a -> ReaderT r m a
local =forall r (m :: * -> *) a.
(r -> r) -> ReaderT r m a -> ReaderT r m a
ReaderT.localreader :: forall a. (r -> a) -> ReaderT r m a
reader =forall (m :: * -> *) r a. Monad m => (r -> a) -> ReaderT r m a
ReaderT.reader-- | @since 2.3instance(Monadm ,Monoidw )=>MonadReader r (CPSRWS.RWSTr w s m )whereask :: RWST r w s m r
ask =forall (m :: * -> *) r w s. Monad m => RWST r w s m r
CPSRWS.asklocal :: forall a. (r -> r) -> RWST r w s m a -> RWST r w s m a
local =forall r w s (m :: * -> *) a.
(r -> r) -> RWST r w s m a -> RWST r w s m a
CPSRWS.localreader :: forall a. (r -> a) -> RWST r w s m a
reader =forall (m :: * -> *) r a w s. Monad m => (r -> a) -> RWST r w s m a
CPSRWS.readerinstance(Monadm ,Monoidw )=>MonadReader r (LazyRWS.RWSTr w s m )whereask :: RWST r w s m r
ask =forall w (m :: * -> *) r s. (Monoid w, Monad m) => RWST r w s m r
LazyRWS.asklocal :: forall a. (r -> r) -> RWST r w s m a -> RWST r w s m a
local =forall r w s (m :: * -> *) a.
(r -> r) -> RWST r w s m a -> RWST r w s m a
LazyRWS.localreader :: forall a. (r -> a) -> RWST r w s m a
reader =forall w (m :: * -> *) r a s.
(Monoid w, Monad m) =>
(r -> a) -> RWST r w s m a
LazyRWS.readerinstance(Monadm ,Monoidw )=>MonadReader r (StrictRWS.RWSTr w s m )whereask :: RWST r w s m r
ask =forall w (m :: * -> *) r s. (Monoid w, Monad m) => RWST r w s m r
StrictRWS.asklocal :: forall a. (r -> r) -> RWST r w s m a -> RWST r w s m a
local =forall r w s (m :: * -> *) a.
(r -> r) -> RWST r w s m a -> RWST r w s m a
StrictRWS.localreader :: forall a. (r -> a) -> RWST r w s m a
reader =forall w (m :: * -> *) r a s.
(Monoid w, Monad m) =>
(r -> a) -> RWST r w s m a
StrictRWS.reader-- ----------------------------------------------------------------------------- Instances for other mtl transformers---- All of these instances need UndecidableInstances,-- because they do not satisfy the coverage condition.instanceMonadReader r' m =>MonadReader r' (ContTr m )whereask :: ContT r m r'
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r' -> r') -> ContT r m a -> ContT r m a
local =forall (m :: * -> *) r' r a.
Monad m =>
m r'
-> ((r' -> r') -> m r -> m r)
-> (r' -> r')
-> ContT r m a
-> ContT r m a
Cont.liftLocalforall r (m :: * -> *). MonadReader r m => m r
ask forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r' -> a) -> ContT r m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader {- | @since 2.2 -}instanceMonadReader r m =>MonadReader r (ExceptTe m )whereask :: ExceptT e m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> ExceptT e m a -> ExceptT e m a
local =forall (m :: * -> *) e a (n :: * -> *) e' b.
(m (Either e a) -> n (Either e' b))
-> ExceptT e m a -> ExceptT e' n b
mapExceptTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> ExceptT e m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader instanceMonadReader r m =>MonadReader r (IdentityTm )whereask :: IdentityT m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> IdentityT m a -> IdentityT m a
local =forall {k1} {k2} (m :: k1 -> *) (a :: k1) (n :: k2 -> *) (b :: k2).
(m a -> n b) -> IdentityT m a -> IdentityT n b
mapIdentityTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> IdentityT m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader instanceMonadReader r m =>MonadReader r (MaybeTm )whereask :: MaybeT m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> MaybeT m a -> MaybeT m a
local =forall (m :: * -> *) a (n :: * -> *) b.
(m (Maybe a) -> n (Maybe b)) -> MaybeT m a -> MaybeT n b
mapMaybeTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> MaybeT m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader instanceMonadReader r m =>MonadReader r (Lazy.StateTs m )whereask :: StateT s m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> StateT s m a -> StateT s m a
local =forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
Lazy.mapStateTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> StateT s m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader instanceMonadReader r m =>MonadReader r (Strict.StateTs m )whereask :: StateT s m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> StateT s m a -> StateT s m a
local =forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
Strict.mapStateTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> StateT s m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader -- | @since 2.3instance(Monoidw ,MonadReader r m )=>MonadReader r (CPS.WriterTw m )whereask :: WriterT w m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> WriterT w m a -> WriterT w m a
local =forall (n :: * -> *) w w' (m :: * -> *) a b.
(Monad n, Monoid w, Monoid w') =>
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
CPS.mapWriterTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> WriterT w m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader instance(Monoidw ,MonadReader r m )=>MonadReader r (Lazy.WriterTw m )whereask :: WriterT w m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> WriterT w m a -> WriterT w m a
local =forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
Lazy.mapWriterTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> WriterT w m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader instance(Monoidw ,MonadReader r m )=>MonadReader r (Strict.WriterTw m )whereask :: WriterT w m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> WriterT w m a -> WriterT w m a
local =forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
Strict.mapWriterTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> WriterT w m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader -- | @since 2.3instance(Monoidw ,MonadReader r m )=>MonadReader r (AccumTw m )whereask :: AccumT w m r
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask local :: forall a. (r -> r) -> AccumT w m a -> AccumT w m a
local =forall (m :: * -> *) a w (n :: * -> *) b.
(m (a, w) -> n (b, w)) -> AccumT w m a -> AccumT w n b
Accum.mapAccumTforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local reader :: forall a. (r -> a) -> AccumT w m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader -- | @since 2.3instance(MonadReader r' m )=>MonadReader r' (SelectTr m )whereask :: SelectT r m r'
ask =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall r (m :: * -> *). MonadReader r m => m r
ask -- there is no Select.liftLocallocal :: forall a. (r' -> r') -> SelectT r m a -> SelectT r m a
local r' -> r'
f SelectT r m a
m =forall r (m :: * -> *) a. ((a -> m r) -> m a) -> SelectT r m a
SelectTforall a b. (a -> b) -> a -> b
$\a -> m r
c ->dor'
r <-forall r (m :: * -> *). MonadReader r m => m r
ask forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local r' -> r'
f (forall r (m :: * -> *) a. SelectT r m a -> (a -> m r) -> m a
runSelectTSelectT r m a
m (forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (forall a b. a -> b -> a
constr'
r )forall b c a. (b -> c) -> (a -> b) -> a -> c
.a -> m r
c ))reader :: forall a. (r' -> a) -> SelectT r m a
reader =forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader 

AltStyle によって変換されたページ (->オリジナル) /