{-# LANGUAGE TypeFamilies #-}{-# LANGUAGE TypeOperators #-}{-# LANGUAGE TypeSynonymInstances #-}{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE FlexibleInstances #-}{-# LANGUAGE MultiParamTypeClasses #-}{-# LANGUAGE UndecidableInstances #-}------------------------------------------------------------------------ |-- Module : Control.Monad.Representable.State-- Copyright : (c) Edward Kmett & Sjoerd Visscher 2011-- License : BSD3---- Maintainer : ekmett@gmail.com-- Stability : experimental---- A generalized State monad, parameterized by a Representable functor.-- The representation of that functor serves as the state.----------------------------------------------------------------------moduleControl.Monad.Representable.State(State ,runState ,evalState ,execState ,mapState ,StateT (..),stateT ,runStateT ,evalStateT ,execStateT ,mapStateT ,liftCallCC ,liftCallCC' ,MonadState(..))whereimportControl.MonadimportData.Functor.BindimportData.Functor.Bind.TransimportControl.Monad.State.ClassimportControl.Monad.Cont.Class(MonadCont(..))importControl.Monad.Reader.ClassimportControl.Monad.Writer.ClassimportControl.Monad.Free.ClassimportControl.Monad.Trans.ClassimportData.Functor.IdentityimportData.Functor.Rep -- ----------------------------------------------------------------------------- | A memoized state monad parameterized by a representable functor @g@, where-- the representatation of @g@, @Rep g@ is the state to carry.---- The 'return' function leaves the state unchanged, while @>>=@ uses-- the final state of the first computation as the initial state of-- the second.typeState g =StateT g Identity-- | Unwrap a state monad computation as a function.-- (The inverse of 'state'.)runState ::Representable g =>State g a -- ^ state-passing computation to execute->Rep g -- ^ initial state->(a ,Rep g )-- ^ return value and final staterunState :: forall (g :: * -> *) a.
Representable g =>
State g a -> Rep g -> (a, Rep g)
runState State g a
m =Identity (a, Rep g) -> (a, Rep g)
forall a. Identity a -> a
runIdentity(Identity (a, Rep g) -> (a, Rep g))
-> (Rep g -> Identity (a, Rep g)) -> Rep g -> (a, Rep g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.State g a -> Rep g -> Identity (a, Rep g)
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
runStateT State g a
m -- | Evaluate a state computation with the given initial state-- and return the final value, discarding the final state.---- * @'evalState' m s = 'fst' ('runState' m s)@evalState ::Representable g =>State g a -- ^state-passing computation to execute->Rep g -- ^initial value->a -- ^return value of the state computationevalState :: forall (g :: * -> *) a. Representable g => State g a -> Rep g -> a
evalState State g a
m Rep g
s =(a, Rep g) -> a
forall a b. (a, b) -> a
fst(State g a -> Rep g -> (a, Rep g)
forall (g :: * -> *) a.
Representable g =>
State g a -> Rep g -> (a, Rep g)
runState State g a
m Rep g
s )-- | Evaluate a state computation with the given initial state-- and return the final state, discarding the final value.---- * @'execState' m s = 'snd' ('runState' m s)@execState ::Representable g =>State g a -- ^state-passing computation to execute->Rep g -- ^initial value->Rep g -- ^final stateexecState :: forall (g :: * -> *) a.
Representable g =>
State g a -> Rep g -> Rep g
execState State g a
m Rep g
s =(a, Rep g) -> Rep g
forall a b. (a, b) -> b
snd(State g a -> Rep g -> (a, Rep g)
forall (g :: * -> *) a.
Representable g =>
State g a -> Rep g -> (a, Rep g)
runState State g a
m Rep g
s )-- | Map both the return value and final state of a computation using-- the given function.---- * @'runState' ('mapState' f m) = f . 'runState' m@mapState ::Functorg =>((a ,Rep g )->(b ,Rep g ))->State g a ->State g b mapState :: forall (g :: * -> *) a b.
Functor g =>
((a, Rep g) -> (b, Rep g)) -> State g a -> State g b
mapState (a, Rep g) -> (b, Rep g)
f =(Identity (a, Rep g) -> Identity (b, Rep g))
-> StateT g Identity a -> StateT g Identity b
forall (g :: * -> *) (m :: * -> *) a (n :: * -> *) b.
Functor g =>
(m (a, Rep g) -> n (b, Rep g)) -> StateT g m a -> StateT g n b
mapStateT ((b, Rep g) -> Identity (b, Rep g)
forall a. a -> Identity a
Identity((b, Rep g) -> Identity (b, Rep g))
-> (Identity (a, Rep g) -> (b, Rep g))
-> Identity (a, Rep g)
-> Identity (b, Rep g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(a, Rep g) -> (b, Rep g)
f ((a, Rep g) -> (b, Rep g))
-> (Identity (a, Rep g) -> (a, Rep g))
-> Identity (a, Rep g)
-> (b, Rep g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Identity (a, Rep g) -> (a, Rep g)
forall a. Identity a -> a
runIdentity)-- ----------------------------------------------------------------------------- | A state transformer monad parameterized by:---- * @g@ - A representable functor used to memoize results for a state @Rep g@---- * @m@ - The inner monad.---- The 'return' function leaves the state unchanged, while @>>=@ uses-- the final state of the first computation as the initial state of-- the second.newtypeStateT g m a =StateT {forall (g :: * -> *) (m :: * -> *) a.
StateT g m a -> g (m (a, Rep g))
getStateT ::g (m (a ,Rep g ))}stateT ::Representable g =>(Rep g ->m (a ,Rep g ))->StateT g m a stateT :: forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT =g (m (a, Rep g)) -> StateT g m a
forall (g :: * -> *) (m :: * -> *) a.
g (m (a, Rep g)) -> StateT g m a
StateT (g (m (a, Rep g)) -> StateT g m a)
-> ((Rep g -> m (a, Rep g)) -> g (m (a, Rep g)))
-> (Rep g -> m (a, Rep g))
-> StateT g m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Rep g -> m (a, Rep g)) -> g (m (a, Rep g))
forall a. (Rep g -> a) -> g a
forall (f :: * -> *) a. Representable f => (Rep f -> a) -> f a
tabulate runStateT ::Representable g =>StateT g m a ->Rep g ->m (a ,Rep g )runStateT :: forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
runStateT (StateT g (m (a, Rep g))
m )=g (m (a, Rep g)) -> Rep g -> m (a, Rep g)
forall a. g a -> Rep g -> a
forall (f :: * -> *) a. Representable f => f a -> Rep f -> a
index g (m (a, Rep g))
m mapStateT ::Functorg =>(m (a ,Rep g )->n (b ,Rep g ))->StateT g m a ->StateT g n b mapStateT :: forall (g :: * -> *) (m :: * -> *) a (n :: * -> *) b.
Functor g =>
(m (a, Rep g) -> n (b, Rep g)) -> StateT g m a -> StateT g n b
mapStateT m (a, Rep g) -> n (b, Rep g)
f (StateT g (m (a, Rep g))
m )=g (n (b, Rep g)) -> StateT g n b
forall (g :: * -> *) (m :: * -> *) a.
g (m (a, Rep g)) -> StateT g m a
StateT ((m (a, Rep g) -> n (b, Rep g))
-> g (m (a, Rep g)) -> g (n (b, Rep g))
forall a b. (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmapm (a, Rep g) -> n (b, Rep g)
f g (m (a, Rep g))
m )-- | Evaluate a state computation with the given initial state-- and return the final value, discarding the final state.---- * @'evalStateT' m s = 'liftM' 'fst' ('runStateT' m s)@evalStateT ::(Representable g ,Monadm )=>StateT g m a ->Rep g ->m a evalStateT :: forall (g :: * -> *) (m :: * -> *) a.
(Representable g, Monad m) =>
StateT g m a -> Rep g -> m a
evalStateT StateT g m a
m Rep g
s =do(a
a ,Rep g
_)<-StateT g m a -> Rep g -> m (a, Rep g)
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
runStateT StateT g m a
m Rep g
s a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
returna
a -- | Evaluate a state computation with the given initial state-- and return the final state, discarding the final value.---- * @'execStateT' m s = 'liftM' 'snd' ('runStateT' m s)@execStateT ::(Representable g ,Monadm )=>StateT g m a ->Rep g ->m (Rep g )execStateT :: forall (g :: * -> *) (m :: * -> *) a.
(Representable g, Monad m) =>
StateT g m a -> Rep g -> m (Rep g)
execStateT StateT g m a
m Rep g
s =do(a
_,Rep g
s' )<-StateT g m a -> Rep g -> m (a, Rep g)
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
runStateT StateT g m a
m Rep g
s Rep g -> m (Rep g)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
returnRep g
s' instance(Functorg ,Functorm )=>Functor(StateT g m )wherefmap :: forall a b. (a -> b) -> StateT g m a -> StateT g m b
fmapa -> b
f =g (m (b, Rep g)) -> StateT g m b
forall (g :: * -> *) (m :: * -> *) a.
g (m (a, Rep g)) -> StateT g m a
StateT (g (m (b, Rep g)) -> StateT g m b)
-> (StateT g m a -> g (m (b, Rep g)))
-> StateT g m a
-> StateT g m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(m (a, Rep g) -> m (b, Rep g))
-> g (m (a, Rep g)) -> g (m (b, Rep g))
forall a b. (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap(((a, Rep g) -> (b, Rep g)) -> m (a, Rep g) -> m (b, Rep g)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap(\~(a
a ,Rep g
s )->(a -> b
f a
a ,Rep g
s )))(g (m (a, Rep g)) -> g (m (b, Rep g)))
-> (StateT g m a -> g (m (a, Rep g)))
-> StateT g m a
-> g (m (b, Rep g))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.StateT g m a -> g (m (a, Rep g))
forall (g :: * -> *) (m :: * -> *) a.
StateT g m a -> g (m (a, Rep g))
getStateT instance(Representable g ,Bindm )=>Apply(StateT g m )whereStateT g m (a -> b)
mf <.> :: forall a b. StateT g m (a -> b) -> StateT g m a -> StateT g m b
<.> StateT g m a
ma =StateT g m (a -> b)
mf StateT g m (a -> b) -> ((a -> b) -> StateT g m b) -> StateT g m b
forall a b. StateT g m a -> (a -> StateT g m b) -> StateT g m b
forall (m :: * -> *) a b. Bind m => m a -> (a -> m b) -> m b
>>-\a -> b
f ->(a -> b) -> StateT g m a -> StateT g m b
forall a b. (a -> b) -> StateT g m a -> StateT g m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmapa -> b
f StateT g m a
ma instance(Representable g ,Functorm ,Monadm )=>Applicative(StateT g m )wherepure :: forall a. a -> StateT g m a
pure=g (m (a, Rep g)) -> StateT g m a
forall (g :: * -> *) (m :: * -> *) a.
g (m (a, Rep g)) -> StateT g m a
StateT (g (m (a, Rep g)) -> StateT g m a)
-> (a -> g (m (a, Rep g))) -> a -> StateT g m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.((a, Rep g) -> m (a, Rep g)) -> a -> g (m (a, Rep g))
forall (u :: * -> *) a b.
Representable u =>
((a, Rep u) -> b) -> a -> u b
leftAdjunctRep (a, Rep g) -> m (a, Rep g)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
returnStateT g m (a -> b)
mf <*> :: forall a b. StateT g m (a -> b) -> StateT g m a -> StateT g m b
<*>StateT g m a
ma =StateT g m (a -> b)
mf StateT g m (a -> b) -> ((a -> b) -> StateT g m b) -> StateT g m b
forall a b. StateT g m a -> (a -> StateT g m b) -> StateT g m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=\a -> b
f ->(a -> b) -> StateT g m a -> StateT g m b
forall a b. (a -> b) -> StateT g m a -> StateT g m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmapa -> b
f StateT g m a
ma instance(Representable g ,Bindm )=>Bind(StateT g m )whereStateT g (m (a, Rep g))
m >>- :: forall a b. StateT g m a -> (a -> StateT g m b) -> StateT g m b
>>-a -> StateT g m b
f =g (m (b, Rep g)) -> StateT g m b
forall (g :: * -> *) (m :: * -> *) a.
g (m (a, Rep g)) -> StateT g m a
StateT (g (m (b, Rep g)) -> StateT g m b)
-> g (m (b, Rep g)) -> StateT g m b
forall a b. (a -> b) -> a -> b
$(m (a, Rep ((->) (Rep g))) -> m (b, Rep g))
-> g (m (a, Rep ((->) (Rep g)))) -> g (m (b, Rep g))
forall a b. (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap(m (a, Rep ((->) (Rep g)))
-> ((a, Rep ((->) (Rep g))) -> m (b, Rep g)) -> m (b, Rep g)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Bind m => m a -> (a -> m b) -> m b
>>-(a -> Rep g -> m (b, Rep g))
-> (a, Rep ((->) (Rep g))) -> m (b, Rep g)
forall (u :: * -> *) a b.
Representable u =>
(a -> u b) -> (a, Rep u) -> b
rightAdjunctRep (StateT g m b -> Rep g -> m (b, Rep g)
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
runStateT (StateT g m b -> Rep g -> m (b, Rep g))
-> (a -> StateT g m b) -> a -> Rep g -> m (b, Rep g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.a -> StateT g m b
f ))g (m (a, Rep g))
g (m (a, Rep ((->) (Rep g))))
m instance(Representable g ,Monadm )=>Monad(StateT g m )whereStateT g (m (a, Rep g))
m >>= :: forall a b. StateT g m a -> (a -> StateT g m b) -> StateT g m b
>>=a -> StateT g m b
f =g (m (b, Rep g)) -> StateT g m b
forall (g :: * -> *) (m :: * -> *) a.
g (m (a, Rep g)) -> StateT g m a
StateT (g (m (b, Rep g)) -> StateT g m b)
-> g (m (b, Rep g)) -> StateT g m b
forall a b. (a -> b) -> a -> b
$(m (a, Rep ((->) (Rep g))) -> m (b, Rep g))
-> g (m (a, Rep ((->) (Rep g)))) -> g (m (b, Rep g))
forall a b. (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap(m (a, Rep ((->) (Rep g)))
-> ((a, Rep ((->) (Rep g))) -> m (b, Rep g)) -> m (b, Rep g)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=(a -> Rep g -> m (b, Rep g))
-> (a, Rep ((->) (Rep g))) -> m (b, Rep g)
forall (u :: * -> *) a b.
Representable u =>
(a -> u b) -> (a, Rep u) -> b
rightAdjunctRep (StateT g m b -> Rep g -> m (b, Rep g)
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
runStateT (StateT g m b -> Rep g -> m (b, Rep g))
-> (a -> StateT g m b) -> a -> Rep g -> m (b, Rep g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.a -> StateT g m b
f ))g (m (a, Rep g))
g (m (a, Rep ((->) (Rep g))))
m instanceRepresentable f =>BindTrans(StateT f )whereliftB :: forall (b :: * -> *) a. Bind b => b a -> StateT f b a
liftB b a
m =(Rep f -> b (a, Rep f)) -> StateT f b a
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT ((Rep f -> b (a, Rep f)) -> StateT f b a)
-> (Rep f -> b (a, Rep f)) -> StateT f b a
forall a b. (a -> b) -> a -> b
$\Rep f
s ->(a -> (a, Rep f)) -> b a -> b (a, Rep f)
forall a b. (a -> b) -> b a -> b b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap(\a
a ->(a
a ,Rep f
s ))b a
m instanceRepresentable f =>MonadTrans(StateT f )wherelift :: forall (m :: * -> *) a. Monad m => m a -> StateT f m a
lift m a
m =(Rep f -> m (a, Rep f)) -> StateT f m a
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT ((Rep f -> m (a, Rep f)) -> StateT f m a)
-> (Rep f -> m (a, Rep f)) -> StateT f m a
forall a b. (a -> b) -> a -> b
$\Rep f
s ->(a -> (a, Rep f)) -> m a -> m (a, Rep f)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM(\a
a ->(a
a ,Rep f
s ))m a
m instance(Representable g ,Monadm ,Rep g ~s )=>MonadStates (StateT g m )whereget :: StateT g m s
get =(Rep g -> m (s, Rep g)) -> StateT g m s
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT ((Rep g -> m (s, Rep g)) -> StateT g m s)
-> (Rep g -> m (s, Rep g)) -> StateT g m s
forall a b. (a -> b) -> a -> b
$\Rep g
s ->(s, s) -> m (s, s)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return(s
Rep g
s ,s
Rep g
s )put :: s -> StateT g m ()
put s
s =g (m ((), Rep g)) -> StateT g m ()
forall (g :: * -> *) (m :: * -> *) a.
g (m (a, Rep g)) -> StateT g m a
StateT (g (m ((), Rep g)) -> StateT g m ())
-> g (m ((), Rep g)) -> StateT g m ()
forall a b. (a -> b) -> a -> b
$m ((), Rep g) -> g (m ((), Rep g))
forall (f :: * -> *) a. Representable f => a -> f a
pureRep (m ((), Rep g) -> g (m ((), Rep g)))
-> m ((), Rep g) -> g (m ((), Rep g))
forall a b. (a -> b) -> a -> b
$((), s) -> m ((), s)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return((),s
s )state :: forall a. (s -> (a, s)) -> StateT g m a
states -> (a, s)
f =(Rep g -> m (a, Rep g)) -> StateT g m a
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT ((a, s) -> m (a, s)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return((a, s) -> m (a, s)) -> (s -> (a, s)) -> s -> m (a, s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.s -> (a, s)
f )instance(Representable g ,MonadReadere m )=>MonadReadere (StateT g m )whereask :: StateT g m e
ask =m e -> StateT g m e
forall (m :: * -> *) a. Monad m => m a -> StateT g m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftm e
forall r (m :: * -> *). MonadReader r m => m r
asklocal :: forall a. (e -> e) -> StateT g m a -> StateT g m a
local =(m (a, Rep g) -> m (a, Rep g)) -> StateT g m a -> StateT g m a
forall (g :: * -> *) (m :: * -> *) a (n :: * -> *) b.
Functor g =>
(m (a, Rep g) -> n (b, Rep g)) -> StateT g m a -> StateT g n b
mapStateT ((m (a, Rep g) -> m (a, Rep g)) -> StateT g m a -> StateT g m a)
-> ((e -> e) -> m (a, Rep g) -> m (a, Rep g))
-> (e -> e)
-> StateT g m a
-> StateT g m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(e -> e) -> m (a, Rep g) -> m (a, Rep g)
forall a. (e -> e) -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
localinstance(Representable g ,MonadWriterw m )=>MonadWriterw (StateT g m )wheretell :: w -> StateT g m ()
tell =m () -> StateT g m ()
forall (m :: * -> *) a. Monad m => m a -> StateT g m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift(m () -> StateT g m ()) -> (w -> m ()) -> w -> StateT g m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.w -> m ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
telllisten :: forall a. StateT g m a -> StateT g m (a, w)
listen =(m (a, Rep g) -> m ((a, w), Rep g))
-> StateT g m a -> StateT g m (a, w)
forall (g :: * -> *) (m :: * -> *) a (n :: * -> *) b.
Functor g =>
(m (a, Rep g) -> n (b, Rep g)) -> StateT g m a -> StateT g n b
mapStateT ((m (a, Rep g) -> m ((a, w), Rep g))
 -> StateT g m a -> StateT g m (a, w))
-> (m (a, Rep g) -> m ((a, w), Rep g))
-> StateT g m a
-> StateT g m (a, w)
forall a b. (a -> b) -> a -> b
$\m (a, Rep g)
ma ->do((a
a ,Rep g
s' ),w
w )<-m (a, Rep g) -> m ((a, Rep g), w)
forall a. m a -> m (a, w)
forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w)
listenm (a, Rep g)
ma ((a, w), Rep g) -> m ((a, w), Rep g)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return((a
a ,w
w ),Rep g
s' )pass :: forall a. StateT g m (a, w -> w) -> StateT g m a
pass =(m ((a, w -> w), Rep g) -> m (a, Rep g))
-> StateT g m (a, w -> w) -> StateT g m a
forall (g :: * -> *) (m :: * -> *) a (n :: * -> *) b.
Functor g =>
(m (a, Rep g) -> n (b, Rep g)) -> StateT g m a -> StateT g n b
mapStateT ((m ((a, w -> w), Rep g) -> m (a, Rep g))
 -> StateT g m (a, w -> w) -> StateT g m a)
-> (m ((a, w -> w), Rep g) -> m (a, Rep g))
-> StateT g m (a, w -> w)
-> StateT g m a
forall a b. (a -> b) -> a -> b
$\m ((a, w -> w), Rep g)
ma ->m ((a, Rep g), w -> w) -> m (a, Rep g)
forall a. m (a, w -> w) -> m a
forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a
pass(m ((a, Rep g), w -> w) -> m (a, Rep g))
-> m ((a, Rep g), w -> w) -> m (a, Rep g)
forall a b. (a -> b) -> a -> b
$do((a
a ,w -> w
f ),Rep g
s' )<-m ((a, w -> w), Rep g)
ma ((a, Rep g), w -> w) -> m ((a, Rep g), w -> w)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return((a
a ,Rep g
s' ),w -> w
f )instance(Representable g ,MonadContm )=>MonadCont(StateT g m )wherecallCC :: forall a b. ((a -> StateT g m b) -> StateT g m a) -> StateT g m a
callCC =((((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g))
-> ((a -> StateT g m b) -> StateT g m a) -> StateT g m a
forall (g :: * -> *) a (m :: * -> *) b.
Representable g =>
((((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g))
-> ((a -> StateT g m b) -> StateT g m a) -> StateT g m a
liftCallCC' (((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g)
forall a b. ((a -> m b) -> m a) -> m a
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCCinstance(Functorf ,Representable g ,MonadFreef m )=>MonadFreef (StateT g m )wherewrap :: forall a. f (StateT g m a) -> StateT g m a
wrap f (StateT g m a)
as =(Rep g -> m (a, Rep g)) -> StateT g m a
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT ((Rep g -> m (a, Rep g)) -> StateT g m a)
-> (Rep g -> m (a, Rep g)) -> StateT g m a
forall a b. (a -> b) -> a -> b
$\Rep g
s ->f (m (a, Rep g)) -> m (a, Rep g)
forall a. f (m a) -> m a
forall (f :: * -> *) (m :: * -> *) a.
MonadFree f m =>
f (m a) -> m a
wrap((StateT g m a -> m (a, Rep g))
-> f (StateT g m a) -> f (m (a, Rep g))
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap(StateT g m a -> Rep g -> m (a, Rep g)
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
`runStateT` Rep g
s )f (StateT g m a)
as )leftAdjunctRep ::Representable u =>((a ,Rep u )->b )->a ->u b leftAdjunctRep :: forall (u :: * -> *) a b.
Representable u =>
((a, Rep u) -> b) -> a -> u b
leftAdjunctRep (a, Rep u) -> b
f a
a =(Rep u -> b) -> u b
forall a. (Rep u -> a) -> u a
forall (f :: * -> *) a. Representable f => (Rep f -> a) -> f a
tabulate (\Rep u
s ->(a, Rep u) -> b
f (a
a ,Rep u
s ))rightAdjunctRep ::Representable u =>(a ->u b )->(a ,Rep u )->b rightAdjunctRep :: forall (u :: * -> *) a b.
Representable u =>
(a -> u b) -> (a, Rep u) -> b
rightAdjunctRep a -> u b
f ~(a
a ,Rep u
k )=a -> u b
f a
a u b -> Rep u -> b
forall a. u a -> Rep u -> a
forall (f :: * -> *) a. Representable f => f a -> Rep f -> a
`index` Rep u
k -- | Uniform lifting of a @callCC@ operation to the new monad.-- This version rolls back to the original state on entering the-- continuation.liftCallCC ::Representable g =>((((a ,Rep g )->m (b ,Rep g ))->m (a ,Rep g ))->m (a ,Rep g ))->((a ->StateT g m b )->StateT g m a )->StateT g m a liftCallCC :: forall (g :: * -> *) a (m :: * -> *) b.
Representable g =>
((((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g))
-> ((a -> StateT g m b) -> StateT g m a) -> StateT g m a
liftCallCC (((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g)
callCC' (a -> StateT g m b) -> StateT g m a
f =(Rep g -> m (a, Rep g)) -> StateT g m a
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT ((Rep g -> m (a, Rep g)) -> StateT g m a)
-> (Rep g -> m (a, Rep g)) -> StateT g m a
forall a b. (a -> b) -> a -> b
$\Rep g
s ->(((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g)
callCC' ((((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g))
-> (((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g)
forall a b. (a -> b) -> a -> b
$\(a, Rep g) -> m (b, Rep g)
c ->StateT g m a -> Rep g -> m (a, Rep g)
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
runStateT ((a -> StateT g m b) -> StateT g m a
f (\a
a ->g (m (b, Rep g)) -> StateT g m b
forall (g :: * -> *) (m :: * -> *) a.
g (m (a, Rep g)) -> StateT g m a
StateT (g (m (b, Rep g)) -> StateT g m b)
-> g (m (b, Rep g)) -> StateT g m b
forall a b. (a -> b) -> a -> b
$m (b, Rep g) -> g (m (b, Rep g))
forall (f :: * -> *) a. Representable f => a -> f a
pureRep (m (b, Rep g) -> g (m (b, Rep g)))
-> m (b, Rep g) -> g (m (b, Rep g))
forall a b. (a -> b) -> a -> b
$(a, Rep g) -> m (b, Rep g)
c (a
a ,Rep g
s )))Rep g
s -- | In-situ lifting of a @callCC@ operation to the new monad.-- This version uses the current state on entering the continuation.-- It does not satisfy the laws of a monad transformer.liftCallCC' ::Representable g =>((((a ,Rep g )->m (b ,Rep g ))->m (a ,Rep g ))->m (a ,Rep g ))->((a ->StateT g m b )->StateT g m a )->StateT g m a liftCallCC' :: forall (g :: * -> *) a (m :: * -> *) b.
Representable g =>
((((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g))
-> ((a -> StateT g m b) -> StateT g m a) -> StateT g m a
liftCallCC' (((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g)
callCC' (a -> StateT g m b) -> StateT g m a
f =(Rep g -> m (a, Rep g)) -> StateT g m a
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT ((Rep g -> m (a, Rep g)) -> StateT g m a)
-> (Rep g -> m (a, Rep g)) -> StateT g m a
forall a b. (a -> b) -> a -> b
$\Rep g
s ->(((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g)
callCC' ((((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g))
-> (((a, Rep g) -> m (b, Rep g)) -> m (a, Rep g)) -> m (a, Rep g)
forall a b. (a -> b) -> a -> b
$\(a, Rep g) -> m (b, Rep g)
c ->StateT g m a -> Rep g -> m (a, Rep g)
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
StateT g m a -> Rep g -> m (a, Rep g)
runStateT ((a -> StateT g m b) -> StateT g m a
f (\a
a ->(Rep g -> m (b, Rep g)) -> StateT g m b
forall (g :: * -> *) (m :: * -> *) a.
Representable g =>
(Rep g -> m (a, Rep g)) -> StateT g m a
stateT ((Rep g -> m (b, Rep g)) -> StateT g m b)
-> (Rep g -> m (b, Rep g)) -> StateT g m b
forall a b. (a -> b) -> a -> b
$\Rep g
s' ->(a, Rep g) -> m (b, Rep g)
c (a
a ,Rep g
s' )))Rep g
s 

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