[auto ekmett@gmail.com**20090505081933 Ignore-this: 67e065d66464574632bdf52b11846696 ] { hunk ./doc/html/monad-ran/Control-Monad-Ran.html 22 ->monad-ran-0.0.7: Fast implementations of monads and monad transformers using right Kan extensionsmonad-ran-0.0.8: Fast implementations of monads and monad transformers using right Kan extensionsThe Yoneda Lemma +>A right Kan extension monad transformer hunk ./doc/html/monad-ran/Control-Monad-Ran.html 74 ->The codensity monad of a functor +>Representing monads as right Kan extensions hunk ./doc/html/monad-ran/Control-Monad-Ran.html 79 ->A right Kan extension monad transformer +>Ran Monad Transformers hunk ./doc/html/monad-ran/Control-Monad-Ran.html 84 ->Representing monads as right Kan extensions +>Default definitions for common extension patterns hunk ./doc/html/monad-ran/Control-Monad-Ran.html 89 ->Ran Monad Transformers +>IO, ST s, STM hunk ./doc/html/monad-ran/Control-Monad-Ran.html 94 ->Default definitions for common extension patterns +>Pointed Functors hunk ./doc/html/monad-ran/Control-Monad-Ran.html 99 ->IO, ST s, STM +>The Yoneda Lemma +
The codensity monad of a functor hunk ./doc/html/monad-ran/Control-Monad-Ran.html 136 -> Yoneda f a = Yoneda {
getYoneda :: forall b. (a -> b) -> f b
}data Codensity f a = Codensity {
getCodensity :: forall b. (a -> f b) -> f b
}dataThe Yoneda Lemma -
data Yoneda f a Source
class Functor f => Pointed f whereConstructors}
Yoneda
getYoneda :: forall b. (a -> b) -> f b
point :: a -> f ashow/hide Instances
getYoneda :: forall b. (a -> b) -> f b
The codensity monad of a functor -
Codensity f a Source
The Codensity monad of a functor/monad generated by a functor -
Constructors
}monad-ran-0.0.7: Fast implementations of monads and monad transformers using right Kan extensions (Index)monad-ran-0.0.8: Fast implementations of monads and monad transformers using right Kan extensions (Index)monad-ran-0.0.7: Fast implementations of monads and monad transformers using right Kan extensionsmonad-ran-0.0.8: Fast implementations of monads and monad transformers using right Kan extensionsControl.Monad.Codensity, Control.Monad.Codensity, Control.Monad.Codensity, getMaybe'monad-ran-0.0.8: Fast implementations of monads and monad transformers using right Kan extensionsmonad-ran-0.0.7: Fast implementations of monads and monad transformers using right Kan extensionsmonad-ran-0.0.8: Fast implementations of monads and monad transformers using right Kan extensionsFunctor
Codensity
Codensity f a = Codensity {
getCodensitygetCodensity
show/hide Instances
MonadRWS r w s m => MonadRWS r w s (Ran (Codensity m))
MonadRWS r w s m => MonadRWS r w s (MonadError e m => MonadError e ( e m => MonadError e (Ran (Codensity m))
MonadErrorMonadReader r m => MonadReader r (Ran (Codensity m))
MonadReader r m => MonadReader r (MonadState s m => MonadState s (MonadState s m => MonadState s (MonadWriter w m => MonadWriter w (MonadWriter w m => MonadWriter w (Ran (Codensity m))
w => w => m => m => e) => e) => f => f => (RanIso m, Eq (Ran m (Either a b))) => Eq (Ran (ErrorT a m) b)
(RanIso m, Ord (Ran m (Either a b))) => Ord (Ran (ErrorT a m) b)
(RanIso m, Read (Ran m (Either a b))) => Read (Ran (ErrorT a m) b)
(RanIso m, Show (Ran m (Either a b))) => Show (Ran (ErrorT a m) b)
Pointed Functors +
class Functor f => Pointed f whereSource
A pointed functor is a functor with a discriminated family of f-coalgebras +
Methods
point :: a -> f aSource
show/hide Instances
The Yoneda Lemma +
data Yoneda f a Source
The Covariant Yoneda lemma applied to a functor. Note that f need not be a Hask Functor! +
Constructors
Yoneda
getYoneda :: forall b. (a -> b) -> f b
show/hide Instances
The codensity monad of a functor +
data Codensity f a Source
The Codensity monad of a functor/monad generated by a functor +
Constructors
Codensity
getCodensity :: forall b. (a -> f b) -> f b
show/hide Instances
lowerCodensity :: Monad m => Codensity m a -> m aSource
lowerCodensityApp :: Applicative f => Codensity f a -> f aSource
lowerCodensityPointed :: Applicative f => Codensity f a -> f aSource
Control.Monad.Yoneda, Control.Monad.CodensityControl.Monad.RanControl.Monad.CodensityControl.Monad.RanControl.Monad.CodensityControl.Monad.RanlowerYoneda
Maybe'
1 (Type/Class)
2 (Data Constructor)
maybe'
Control.Functor.PointedControl.Monad.RanControl.Functor.PointedControl.Monad.RanControl.Monad.Yoneda, Control.Monad.Yoneda, monad-ran-0.0.7: Fast implementations of monads and monad transformers using right Kan extensionsmonad-ran-0.0.8: Fast implementations of monads and monad transformers using right Kan extensionsmonad-ran-0.0.7: Fast implementations of monads and monad transformers using right Kan extensions
Control.Functor.Pointed
show/hide
show/hideCPS
Control.Monad.CPS.Maybe
Control.Monad.Codensity
( --- * The Yoneda Lemma -Yoneda(..) --- * The codensity monad of a functor -,Codensity(..) --- * A right Kan extension monad transformer -,Ran(..) --- * Representing monads as right Kan extensions -,RMonad -,G -,H -,liftRan -,lowerRan --- * Ran Monad Transformers -,RanTrans -,liftRanT -,outRan -,inRan --- * Default definitions for common extension patterns -,returnRanCodensity -,bindRanCodensity -,apRanCodensity -,ranCodensity -,codensityRan -,liftRanCodensity -,lowerRanCodensity --- * IO, ST s, STM -,liftRanWorld -,lowerRanWorld -)where - -importData.Monoid -importData.Maybe(maybe) -importControl.Applicative -importControl.Functor.Pointed -importControl.Monad -importControl.Monad.Yoneda -importControl.Monad.Codensity +(-- * A right Kan extension monad transformer +Ran(..) +-- * Representing monads as right Kan extensions +,RMonad +,G +,H +,liftRan +,lowerRan +-- * Ran Monad Transformers +,RanTrans +,liftRanT +,outRan +,inRan +-- * Default definitions for common extension patterns +,returnRanCodensity +,bindRanCodensity +,apRanCodensity +,ranCodensity +,codensityRan +,liftRanCodensity +,lowerRanCodensity +-- * IO, ST s, STM +,liftRanWorld +,lowerRanWorld +-- * Pointed Functors +,Pointed(..) +-- * The Yoneda Lemma +,Yoneda(..) +-- * The codensity monad of a functor +,Codensity(..) +,lowerCodensity +,lowerCodensityApp +,lowerCodensityPointed +)where + +importControl.Applicative + +importControl.Monad hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 54 -importControl.Monad.Error -importControl.Monad.Reader -importControl.Monad.Writer -importControl.Monad.RWS - -importGHC.Prim -importGHC.IOBasehiding(liftIO) -importGHC.Conc -importGHC.ST +importControl.Monad.List +importControl.Monad.Error +importControl.Monad.Reader +importControl.Monad.Writer +importControl.Monad.RWS + +importqualifiedControl.Monad.Writer.StrictasSW +importqualifiedControl.Monad.State.StrictasSS +importqualifiedControl.Monad.RWS.StrictasSR hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 64 -importText.Readhiding(get) -importText.Show +importData.Monoid +importData.Maybe(maybe) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 67 --- | A right Kan extension transformer for a monad -dataRanma=Ran{getRan::forallb.(a->Gmb)->Hmb} - -class{- Functor (G f) => -}RanIsofwhere -typeGf::*->* -typeHf::*->* -liftRan::fa->Ranfa -lowerRan::Ranfa->fa - -classRanTranstwhere -liftRanT::(RanIsom,RanIso(tm))=>Ranma->Ran(tm)a -outRan::(RanIsom,RanIso(tm))=>Ran(tm)a->t(Ranm)a -inRan::(RanIsom,RanIso(tm))=>t(Ranm)a->Ran(tm)a - -instanceRanIsof=>Functor(Ranf)where -fmapfm=Ran(\k->getRanm(k.f)) +importGHC.Prim +importGHC.IOBasehiding(liftIO) +importGHC.Conc +importGHC.ST + +importText.Readhiding(get,lift) +importText.Show + +-- | A right Kan extension transformer for a monad +dataRanma=Ran{getRan::forallb.(a->Gmb)->Hmb} + +classRanIsofwhere +typeGf::*->* +typeHf::*->* +liftRan::fa->Ranfa +lowerRan::Ranfa->fa hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 84 --- Codensity-like embeddings - -returnRanCodensity::(RanIsom,Gm~Hm)=>a->Ranma -returnRanCodensitya=Ran(\k->ka) +classRanTranstwhere +liftRanT::(RanIsom,RanIso(tm))=>Ranma->Ran(tm)a +outRan::(RanIsom,RanIso(tm))=>Ran(tm)a->t(Ranm)a +inRan::(RanIsom,RanIso(tm))=>t(Ranm)a->Ran(tm)a hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 89 -bindRanCodensity::(RanIsom,Gm~Hm)=>Ranma->(a->Ranmb)->Ranmb -bindRanCodensity(Ranm)k=Ran(\c->m(\a->getRan(ka)c)) +instanceRanIsof=>Functor(Ranf)where +fmapfm=Ran(\k->getRanm(k.f)) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 92 -apRanCodensity::(RanIsom,Gm~Hm)=>Ranm(a->b)->Ranma->Ranmb -apRanCodensity(Ranf)(Ranx)=Ran(\k->f(\f'->x(\x'->k(f'x')))) +class(Monad(Ranf),Monadf,RanIsof)=>RMonadf +instance(Monad(Ranf),Monadf,RanIsof)=>RMonadf hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 95 -liftRanCodensity::(RanIsom,Gm~Hm,Monad(Gm))=>Gma->Ranma -liftRanCodensityf=Ran(f>>=) +class(Applicative(Ranf),Applicativef,RanIsof)=>RApplicativef +instance(Applicative(Ranf),Applicativef,RanIsof)=>RApplicativef hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 98 -lowerRanCodensity::(RanIsom,Gm~Hm,Monad(Gm))=>Ranma->Gma -lowerRanCodensity(Ranf)=freturn +returnRanCodensity::(RanIsom,Gm~Hm)=>a->Ranma +returnRanCodensitya=Ran(\k->ka) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 101 -mfixRanCodensity::(RanIsom,Gm~Hm,MonadFix(Gm))=>(a->Ranma)->Ranma -mfixRanCodensityf=liftRanCodensity$mfix(lowerRanCodensity.f) +bindRanCodensity::(RanIsom,Gm~Hm)=>Ranma->(a->Ranmb)->Ranmb +bindRanCodensity(Ranm)k=Ran(\c->m(\a->getRan(ka)c)) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 104 -mfixRan::(RanIsom,MonadFixm)=>(a->Ranma)->Ranma -mfixRanf=liftRan$mfix(lowerRan.f) +apRanCodensity::(RanIsom,Gm~Hm)=>Ranm(a->b)->Ranma->Ranmb +apRanCodensity(Ranf)(Ranx)=Ran(\k->f(\f'->x(\x'->k(f'x')))) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 107 -class(Monad(Ranf),Monadf,RanIsof)=>RMonadf -instance(Monad(Ranf),Monadf,RanIsof)=>RMonadf +liftRanCodensity::(RanIsom,Gm~Hm,Monad(Gm))=>Gma->Ranma +liftRanCodensityf=Ran(f>>=) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 110 -class(Applicative(Ranf),Applicativef,RanIsof)=>RApplicativef -instance(Applicative(Ranf),Applicativef,RanIsof)=>RApplicativef +lowerRanCodensity::(RanIsom,Gm~Hm,Monad(Gm))=>Ranma->Gma +lowerRanCodensity(Ranf)=freturn hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 113 --- The codensity monad as a right Kan extension of a functor along itself --- Many state-like monads can be CPS transformed into a codensity monad. -instanceRanIso(Codensityf)where -typeG(Codensityf)=f -typeH(Codensityf)=f -liftRan=codensityRan -lowerRan=ranCodensity - -ranCodensity::Ran(Codensityf)a->Codensityfa -ranCodensity(Ranf)=Codensityf - -codensityRan::Codensityfa->Ran(Codensityf)a -codensityRan(Codensityf)=Ranf - -instancePointed(Ran(Codensityf))where -point=returnRanCodensity - -instanceApplicative(Ran(Codensityf))where -pure=returnRanCodensity -(<*>)=apRanCodensity - -instanceMonad(Ran(Codensityf))where -return=returnRanCodensity -(>>=)=bindRanCodensity - -instanceAlternative(Codensityf)=>Alternative(Ran(Codensityf))where -empty=liftRanempty -m<|>n=liftRan(lowerRanm<|>lowerRann) - -instanceMonadPlusf=>MonadPlus(Ran(Codensityf))where -mzero=liftRanmzero -m`mplus`n=liftRan(lowerRanm`mplus`lowerRann) - -instanceMonadIOf=>MonadIO(Ran(Codensityf))where -liftIOf=Ran(liftIOf>>=) - -instanceMonadStatesm=>MonadStates(Ran(Codensitym))where -get=Ran(get>>=) -puts=Ran(puts>>=) +mfixRanCodensity::(RanIsom,Gm~Hm,MonadFix(Gm))=>(a->Ranma)->Ranma +mfixRanCodensityf=liftRanCodensity$mfix(lowerRanCodensity.f) + +mfixRan::(RanIsom,MonadFixm)=>(a->Ranma)->Ranma +mfixRanf=liftRan$mfix(lowerRan.f) + +-- | Yoneda Identity a ~ Codensity Identity a ~ forall o. (a -> o) -> o +instanceRanIsoIdentitywhere +typeGIdentity=Identity +typeHIdentity=Identity +liftRanm=Ran(m>>=) +lowerRan=flipgetRanIdentity + +instancePointed(RanIdentity)where +point=returnRanCodensity + +instanceApplicative(RanIdentity)where +pure=returnRanCodensity +(<*>)=apRanCodensity + +instanceMonad(RanIdentity)where +return=returnRanCodensity +(>>=)=bindRanCodensity + +instanceEqa=>Eq(RanIdentitya)where +Ranf==Rang=runIdentity(fIdentity)==runIdentity(gIdentity) + +instanceOrda=>Ord(RanIdentitya)where +Ranf`compare`Rang=runIdentity(fIdentity)`compare`runIdentity(gIdentity) + +instanceShowa=>Show(RanIdentitya)where +showsPrecd(Ranf)=showParen(d>10)$ +showString"return ".showsPrec11(runIdentity(fIdentity)) + +instanceReada=>Read(RanIdentitya)where +readPrec=parens$prec10$do +Ident"return"<-lexP +m<-stepreadPrec +return(returnm) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 153 -instanceMonadWriterwm=>MonadWriterw(Ran(Codensitym))where -tellw=Ran(tellw>>=) -listen=liftRanCodensity.listen.lowerRanCodensity -pass=liftRanCodensity.pass.lowerRanCodensity - -instanceMonadReaderrm=>MonadReaderr(Ran(Codensitym))where -ask=Ran(ask>>=) -localf=liftRanCodensity.localf.lowerRanCodensity - -instanceMonadRWSrwsm=>MonadRWSrws(Ran(Codensitym)) - -instanceMonadFixm=>MonadFix(Ran(Codensitym))where -mfixf=liftRanCodensity$mfix(lowerRanCodensity.f) +-- State s a ~ Codensity (Reader s) a ~ forall o. (a -> s -> o) -> s -> o +instanceRanIso(States)where +typeG(States)=(->)s +typeH(States)=(->)s +liftRan(Stateg)=Ran(\f->uncurryf.g) +lowerRan(Ranf)=State(f(,)) + +instancePointed(Ran(States))where +point=returnRanCodensity + +instanceApplicative(Ran(States))where +pure=returnRanCodensity +(<*>)=apRanCodensity hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 167 -instanceMonadErrorem=>MonadErrore(Ran(Codensitym))where -throwErrore=Ran(throwErrore>>=) -m`catchError`h=liftRanCodensity(lowerRanCodensitym`catchError`(lowerRanCodensity.h)) +instanceMonad(Ran(States))where +return=returnRanCodensity +(>>=)=bindRanCodensity hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 171 --- TODO: any other instances for Ran (Codensity f) - --- Yoneda Identity a ~ Codensity Identity a ~ forall o. (a -> o) -> o -instanceRanIsoIdentitywhere -typeGIdentity=Identity -typeHIdentity=Identity -liftRanm=Ran(m>>=) -lowerRan=flipgetRanIdentity - -instancePointed(RanIdentity)where -point=returnRanCodensity +instanceMonadStates(Ran(States))where +get=Ran(\ks->kss) +puts=Ran(\k_->k()s) + +-- Embedded into CPS'd State rather than directly to avoid superfluous 'mappend mempty' calls for expensive monoids +-- forall o. (a -> w -> o) -> w -> o +instanceMonoidw=>RanIso(Writerw)where +typeG(Writerw)=(->)w +typeH(Writerw)=(->)w +liftRan(Writer(a,w'))=Ran(\fw->fa(w`mappend`w')) +lowerRan(Ranf)=Writer(f(,)mempty) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 183 -instanceApplicative(RanIdentity)where -pure=returnRanCodensity -(<*>)=apRanCodensity - -instanceMonad(RanIdentity)where -return=returnRanCodensity -(>>=)=bindRanCodensity - -instanceEqa=>Eq(RanIdentitya)where -Ranf==Rang=runIdentity(fIdentity)==runIdentity(gIdentity) +instanceMonoidw=>Pointed(Ran(Writerw))where +point=returnRanCodensity + +instanceMonoidw=>Applicative(Ran(Writerw))where +pure=returnRanCodensity +(<*>)=apRanCodensity + +instanceMonoidw=>Monad(Ran(Writerw))where +return=returnRanCodensity +(>>=)=bindRanCodensity hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 194 -instanceOrda=>Ord(RanIdentitya)where -Ranf`compare`Rang=runIdentity(fIdentity)`compare`runIdentity(gIdentity) - -instanceShowa=>Show(RanIdentitya)where -showsPrecd(Ranf)=showParen(d>10)$ -showString"return ".showsPrec11(runIdentity(fIdentity)) - -instanceReada=>Read(RanIdentitya)where -readPrec=parens$prec10$do -Ident"return"<-lexP -m<-stepreadPrec -return(returnm) +instanceMonoidw=>MonadWriterw(Ran(Writerw))where +tellw'=Ran(\fw->f()(w`mappend`w')) +listen(Ranf)=Ran(\g->f(\aw->g(a,w)w)) +pass(Ranf)=Ran(\g->f(\(a,p)w->ga(pw))) + +newtypeWorldwa=World{runWorld::State#w->a} + +liftRanWorld::(Gm~Worldw,Hm~Worldw)=>(State#w->(#State#w,a#))->Ranma +liftRanWorldf=Ran(\k->World(\w->casefwof(#w',a#)->runWorld(ka)w')) + +-- homegrown STret with flopped arguments +dataSTret'sa=STret'a(State#s) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 207 --- Codensity (Reader s) --- forall o. (a -> s -> o) -> s -> o -instanceRanIso(States)where -typeG(States)=(->)s -typeH(States)=(->)s -liftRan(Stateg)=Ran(\f->uncurryf.g) -lowerRan(Ranf)=State(f(,)) - -instancePointed(Ran(States))where -point=returnRanCodensity +lowerRanWorld::(Gm~Worldw,Hm~Worldw)=>Ranma->State#w->(#State#w,a#) +lowerRanWorld(Ranr)w=caserunWorld(r(World.STret'))wof +STret'bw''->(#w'',b#) + +-- Represent IO as the codensity of the RealWorld +instanceRanIsoIOwhere +typeGIO=WorldRealWorld +typeHIO=WorldRealWorld +liftRan(IOa)=liftRanWorlda +lowerRana=IO(lowerRanWorlda) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 218 -instanceApplicative(Ran(States))where +instanceApplicative(RanIO)where hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 222 -instanceMonad(Ran(States))where +instanceMonad(RanIO)where hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 226 -instanceMonadStates(Ran(States))where -get=Ran(\ks->kss) -puts=Ran(\k_->k()s) - --- embedded as CPS'd State rather than directly to avoid superfluous 'mappend mempty' calls for expensive monoids --- forall o. (a -> w -> o) -> w -> o -instanceMonoidw=>RanIso(Writerw)where -typeG(Writerw)=(->)w -typeH(Writerw)=(->)w -liftRan(Writer(a,w'))=Ran(\fw->fa(w`mappend`w')) -lowerRan(Ranf)=Writer(f(,)mempty) - -instanceMonoidw=>Pointed(Ran(Writerw))where -point=returnRanCodensity - -instanceMonoidw=>Applicative(Ran(Writerw))where -pure=returnRanCodensity -(<*>)=apRanCodensity - -instanceMonoidw=>Monad(Ran(Writerw))where -return=returnRanCodensity -(>>=)=bindRanCodensity - -instanceMonoidw=>MonadWriterw(Ran(Writerw))where -tellw'=Ran(\fw->f()(w`mappend`w')) -listen(Ranf)=Ran(\g->f(\aw->g(a,w)w)) -pass(Ranf)=Ran(\g->f(\(a,p)w->ga(pw))) - -newtypeWorldwa=World{runWorld::State#w->a} - - -liftRanWorld::(Gm~Worldw,Hm~Worldw)=>(State#w->(#State#w,a#))->Ranma -liftRanWorldf=Ran(\k->World(\w->casefwof(#w',a#)->runWorld(ka)w')) +instanceMonadIO(RanIO)where +liftIO=liftRan + +instanceMonadPlus(RanIO)where +mzero=liftIOmzero +m`mplus`n=m`catchError`constn + +instanceMonadErrorIOError(RanIO)where +throwError=liftIO.ioError +catchErrormh=liftRan(lowerRanm`catch`(lowerRan.h)) + +instanceMonadFix(RanIO)where +mfix=mfixRan + +-- Represent ST s as the codensity of the world s +instanceRanIso(STs)where +typeG(STs)=Worlds +typeH(STs)=Worlds +liftRan(STs)=liftRanWorlds +lowerRanr=ST(lowerRanWorldr) + +instanceApplicative(Ran(STs))where +pure=returnRanCodensity +(<*>)=apRanCodensity + +instanceMonad(Ran(STs))where +return=returnRanCodensity +(>>=)=bindRanCodensity + +instanceMonadFix(Ran(STs))where +mfixf=liftRan$fixST(lowerRan.f) + +-- todo make a MonadST class hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 260 --- homegrown STret with flopped arguments -dataSTret'sa=STret'a(State#s) - -lowerRanWorld::(Gm~Worldw,Hm~Worldw)=>Ranma->State#w->(#State#w,a#) -lowerRanWorld(Ranr)w=caserunWorld(r(World.STret'))wof -STret'bw''->(#w'',b#) +-- Represent STM as the codensity of the RealWorld +instanceRanIsoSTMwhere +typeGSTM=WorldRealWorld +typeHSTM=WorldRealWorld +liftRan(STMs)=liftRanWorlds +lowerRanr=STM(lowerRanWorldr) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 267 --- Represent IO as the codensity of the RealWorld -instanceRanIsoIOwhere -typeGIO=WorldRealWorld -typeHIO=WorldRealWorld -liftRan(IOa)=liftRanWorlda -lowerRana=IO(lowerRanWorlda) - -instanceApplicative(RanIO)where -pure=returnRanCodensity -(<*>)=apRanCodensity +instanceApplicative(RanSTM)where +pure=returnRanCodensity +(<*>)=apRanCodensity + +instanceMonad(RanSTM)where +return=returnRanCodensity +(>>=)=bindRanCodensity + +-- why is there no MonadFix instance for STM? +-- TODO: make a MonadSTM class hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 278 -instanceMonad(RanIO)where -return=returnRanCodensity -(>>=)=bindRanCodensity - -instanceMonadIO(RanIO)where -liftIO=liftRan - -instanceMonadPlus(RanIO)where -mzero=liftIOmzero -m`mplus`n=m`catchError`constn - -instanceMonadErrorIOError(RanIO)where -throwError=liftIO.ioError -catchErrormh=liftRan(lowerRanm`catch`(lowerRan.h)) +-- Yoneda-like embeddings + +-- Yoneda lemma as a right Kan extension along the identity functor +instanceRanIso(Yonedaf)where +typeG(Yonedaf)=Identity +typeH(Yonedaf)=f +liftRan(Yonedaf)=Ran(\b->f(runIdentity.b)) +lowerRan(Ranf)=Yoneda(\b->f(Identity.b)) + +ranYoneda::Ran(Yonedaf)a->Yonedafa +ranYoneda=lowerRan + +yonedaRan::Yonedafa->Ran(Yonedaf)a +yonedaRan=liftRan hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 293 -instanceMonadFix(RanIO)where -mfix=mfixRan +instancePointedf=>Pointed(Ran(Yonedaf))where +point=liftRan.point hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 296 --- Represent ST s as the codensity of the world s -instanceRanIso(STs)where -typeG(STs)=Worlds -typeH(STs)=Worlds -liftRan(STs)=liftRanWorlds -lowerRanr=ST(lowerRanWorldr) - -instanceApplicative(Ran(STs))where -pure=returnRanCodensity -(<*>)=apRanCodensity - -instanceMonad(Ran(STs))where -return=returnRanCodensity -(>>=)=bindRanCodensity - -instanceMonadFix(Ran(STs))where -mfixf=liftRan$fixST(lowerRan.f) - --- todo make a MonadST class +instanceApplicativef=>Applicative(Ran(Yonedaf))where +pure=liftRan.pure +m<*>n=liftRan(lowerRanm<*>lowerRann) + +instanceAlternativef=>Alternative(Ran(Yonedaf))where +empty=liftRanempty +m<|>n=liftRan(lowerRanm<|>lowerRann) + +instanceMonadf=>Monad(Ran(Yonedaf))where +return=liftRan.return +m>>=k=liftRan(lowerRanm>>=lowerRan.k) + +instanceMonadPlusf=>MonadPlus(Ran(Yonedaf))where +mzero=liftRanmzero +m`mplus`n=liftRan(lowerRanm`mplus`lowerRann) + +instanceMonadReaderrf=>MonadReaderr(Ran(Yonedaf))where +ask=liftRanask +localf=liftRan.localf.lowerRan hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 316 --- Represent STM as the codensity of the RealWorld -instanceRanIsoSTMwhere -typeGSTM=WorldRealWorld -typeHSTM=WorldRealWorld -liftRan(STMs)=liftRanWorlds -lowerRanr=STM(lowerRanWorldr) - -instanceApplicative(RanSTM)where -pure=returnRanCodensity -(<*>)=apRanCodensity - -instanceMonad(RanSTM)where -return=returnRanCodensity -(>>=)=bindRanCodensity - --- why is there no MonadFix instance for STM? --- TODO: make a MonadSTM class +instanceMonadWriterwf=>MonadWriterw(Ran(Yonedaf))where +tell=liftRan.tell +listen=liftRan.listen.lowerRan +pass=liftRan.pass.lowerRan + +instanceMonadStatesf=>MonadStates(Ran(Yonedaf))where +get=liftRanget +put=liftRan.put + +instanceMonadIOf=>MonadIO(Ran(Yonedaf))where +liftIO=liftRan.liftIO + +instanceMonadRWSrwsf=>MonadRWSrws(Ran(Yonedaf)) + +instanceMonadErroref=>MonadErrore(Ran(Yonedaf))where +throwError=liftRan.throwError +Ranf`catchError`h=Ran(\k->fk`catchError`\e->getRan(he)k) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 334 --- Yoneda-like embeddings - --- Yoneda lemma as a right Kan extension along the identity functor -instanceRanIso(Yonedaf)where -typeG(Yonedaf)=Identity -typeH(Yonedaf)=f -liftRan(Yonedaf)=Ran(\b->f(runIdentity.b)) -lowerRan(Ranf)=Yoneda(\b->f(Identity.b)) - -ranYoneda::Ran(Yonedaf)a->Yonedafa -ranYoneda=lowerRan - -yonedaRan::Yonedafa->Ran(Yonedaf)a -yonedaRan=liftRan - -instancePointedf=>Pointed(Ran(Yonedaf))where -point=liftRan.point - -instanceApplicativef=>Applicative(Ran(Yonedaf))where -pure=liftRan.pure -m<*>n=liftRan(lowerRanm<*>lowerRann) - -instanceAlternativef=>Alternative(Ran(Yonedaf))where -empty=liftRanempty -m<|>n=liftRan(lowerRanm<|>lowerRann) - -instanceMonadf=>Monad(Ran(Yonedaf))where -return=liftRan.return -m>>=k=liftRan(lowerRanm>>=lowerRan.k) - -instanceMonadPlusf=>MonadPlus(Ran(Yonedaf))where -mzero=liftRanmzero -m`mplus`n=liftRan(lowerRanm`mplus`lowerRann) - -instanceMonadReaderrf=>MonadReaderr(Ran(Yonedaf))where -ask=liftRanask -localf=liftRan.localf.lowerRan - -instanceMonadWriterwf=>MonadWriterw(Ran(Yonedaf))where -tell=liftRan.tell -listen=liftRan.listen.lowerRan -pass=liftRan.pass.lowerRan - -instanceMonadStatesf=>MonadStates(Ran(Yonedaf))where -get=liftRanget -put=liftRan.put - -instanceMonadIOf=>MonadIO(Ran(Yonedaf))where -liftIO=liftRan.liftIO - -instanceMonadRWSrwsf=>MonadRWSrws(Ran(Yonedaf)) - -instanceMonadErroref=>MonadErrore(Ran(Yonedaf))where -throwError=liftRan.throwError -Ranf`catchError`h=Ran(\k->fk`catchError`\e->getRan(he)k) - -instanceMonadFixm=>MonadFix(Ran(Yonedam))where -mfixf=Ran(\k->liftM(runIdentity.k)$mfix(\a->getRan(fa)Identity)) - --- Yoneda Endo a ~ forall o. (a -> o) -> o -> o ~ forall o. (a -> Identity o) -> Endo o --- note Endo is not a Hask Functor and Maybe is not a Codensity monad, so this is trickier -instanceRanIsoMaybewhere -typeGMaybe=Identity -typeHMaybe=Endo -liftRan=maybemzeroreturn -lowerRanf=appEndo(getRanf(Identity.return))mzero - -instanceMonad(RanMaybe)where -returnx=Ran(\k->Endo(\_->runIdentity(kx))) -Rang>>=f=Ran(\k->Endo(\z->appEndo(g(\a->Identity(appEndo(getRan(fa)k)z)))z)) -fail_=mzero - -instanceApplicative(RanMaybe)where -purex=Ran(\k->Endo(\_->runIdentity(kx))) -Ranf<*>Rang=Ran(\k->Endo(\z->appEndo(f(\f'->Identity(appEndo(g(k.f'))z)))z)) - -instanceMonadPlus(RanMaybe)where -mzero=Ran(\_->Endoid) -Ranm`mplus`Rann=Ran(\k->Endo(\z->appEndo(mk)(appEndo(nk)z))) - -instanceMonoida=>Monoid(RanMaybea)where -mempty=mzero -Rana`mappend`Ranb=Ran(\k->Endo(\z->appEndo(a(\a'->Identity(appEndo(b(k.mappenda'))z)))z)) +instanceMonadFixm=>MonadFix(Ran(Yonedam))where +mfixf=Ran(\k->liftM(runIdentity.k)$mfix(\a->getRan(fa)Identity)) + +-- Yoneda Endo a ~ forall o. (a -> o) -> o -> o ~ forall o. (a -> Identity o) -> Endo o +-- note Endo is not a Hask Functor and Maybe is not a Codensity monad, so this is trickier +instanceRanIsoMaybewhere +typeGMaybe=Identity +typeHMaybe=Endo +liftRan=maybemzeroreturn +lowerRanf=appEndo(getRanf(Identity.return))mzero + +instanceMonad(RanMaybe)where +returnx=Ran(\k->Endo(\_->runIdentity(kx))) +Rang>>=f=Ran(\k->Endo(\z->appEndo(g(\a->Identity(appEndo(getRan(fa)k)z)))z)) +fail_=mzero + +instanceApplicative(RanMaybe)where +purex=Ran(\k->Endo(\_->runIdentity(kx))) +Ranf<*>Rang=Ran(\k->Endo(\z->appEndo(f(\f'->Identity(appEndo(g(k.f'))z)))z)) + +instanceMonadPlus(RanMaybe)where +mzero=Ran(\_->Endoid) +Ranm`mplus`Rann=Ran(\k->Endo(\z->appEndo(mk)(appEndo(nk)z))) + +instanceMonoida=>Monoid(RanMaybea)where +mempty=mzero +Rana`mappend`Ranb=Ran(\k->Endo(\z->appEndo(a(\a'->Identity(appEndo(b(k.mappenda'))z)))z)) + +instanceMonadFix(RanMaybe)where +mfixf=mwhere +m=f(unJustm) +unJust(Ranr)=appEndo(rIdentity)(error"mfix (Ran Maybe): Nothing") + +instanceEqa=>Eq(RanMaybea)where +f==g=lowerRanf==lowerRang + +instanceOrda=>Ord(RanMaybea)where +f`compare`g=lowerRanf`compare`lowerRang + +instanceShowa=>Show(RanMaybea)where +showsPrecdf=showParen(d>10)$ +showString"liftRan ".showsPrec11(lowerRanf) + +instanceReada=>Read(RanMaybea)where +readPrec=parens$prec10$do +Ident"liftRan"<-lexP +m<-stepreadPrec +return(liftRanm) + +type(:->)=ReaderT + +dataErrorHeo=ErrorH{getErrorH::(e->o)->o} + +-- Yoneda (ErrorH e) ~ forall o. (a -> o) -> (e -> o) -> o ~ forall o. (a -> Identity o) -> (e -> o) -> o ~ forall o. (a -> Identity o) -> ErrorH e o +instanceRanIso(Eithere)where +typeG(Eithere)=Identity +typeH(Eithere)=ErrorHe +liftRan(Righta)=Ran(\k->ErrorH(\_->runIdentity(ka))) +liftRan(Leftx)=Ran(\_->ErrorH(\e->ex)) +lowerRan=eitherRanLeftRight + +eitherRan::(e->b)->(a->b)->Ran(Eithere)a->b +eitherRanfg(Ranm)=getErrorH(m(Identity.g))f + +instanceErrore=>Monad(Ran(Eithere))where +returnx=Ran(\k->ErrorH(\_->runIdentity(kx))) +fail=throwError.strMsg +Rang>>=f=Ran(\k->ErrorH(\z->getErrorH(g(\a->Identity(getErrorH(getRan(fa)k)z)))z)) + +instanceErrore=>MonadErrore(Ran(Eithere))where +throwErrorx=Ran(\_->ErrorH(\e->ex)) +-- catchError f h = Ran (\k -> ErrorH (\e -> getErrorH (getRan f k) e)) +-- catchError :: Ran (Either e) a -> (e -> Ran (Either e) a -> Ran (Either e) a +Ranm`catchError`h=Ran(\k->ErrorH(\z->getErrorH(mk)(\e->getErrorH(getRan(he)k)z))) + +instanceErrore=>MonadPlus(Ran(Eithere))where +mzero=throwErrornoMsg +Ranm`mplus`Rann=Ran(\k->ErrorH(\z->getErrorH(mk)(\_->getErrorH(nk)z))) + +instanceErrore=>MonadFix(Ran(Eithere))where +mfixf=mwhere +m=f(fromRightm) +fromRight(Ranr)=getErrorH(rIdentity)(\_->error"mfix (Ran (Either e)): empty mfix argument") hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 418 -instanceMonadFix(RanMaybe)where -mfixf=mwhere -m=f(unJustm) -unJust(Ranr)=appEndo(rIdentity)(error"mfix (Ran Maybe): Nothing") - -instanceEqa=>Eq(RanMaybea)where -f==g=lowerRanf==lowerRang - -instanceOrda=>Ord(RanMaybea)where -f`compare`g=lowerRanf`compare`lowerRang - -instanceShowa=>Show(RanMaybea)where -showsPrecdf=showParen(d>10)$ -showString"liftRan ".showsPrec11(lowerRanf) - -instanceReada=>Read(RanMaybea)where -readPrec=parens$prec10$do -Ident"liftRan "<-lexP -m<-stepreadPrec -return(liftRanm) - -type(:->)=ReaderT - -dataErrorHeo=ErrorH{getErrorH::(e->o)->o} - --- Yoneda (ErrorH e) ~ forall o. (a -> o) -> (e -> o) -> o ~ forall o. (a -> Identity o) -> (e -> o) -> o ~ forall o. (a -> Identity o) -> ErrorH e o -instanceRanIso(Eithere)where -typeG(Eithere)=Identity -typeH(Eithere)=ErrorHe -liftRan(Righta)=Ran(\k->ErrorH(\_->runIdentity(ka))) -liftRan(Leftx)=Ran(\_->ErrorH(\e->ex)) -lowerRan=eitherRanLeftRight - -eitherRan::(e->b)->(a->b)->Ran(Eithere)a->b -eitherRanfg(Ranm)=getErrorH(m(Identity.g))f - -instanceErrore=>Monad(Ran(Eithere))where -returnx=Ran(\k->ErrorH(\_->runIdentity(kx))) -fail=throwError.strMsg -Rang>>=f=Ran(\k->ErrorH(\z->getErrorH(g(\a->Identity(getErrorH(getRan(fa)k)z)))z)) - -instanceErrore=>MonadErrore(Ran(Eithere))where -throwErrorx=Ran(\_->ErrorH(\e->ex)) --- catchError f h = Ran (\k -> ErrorH (\e -> getErrorH (getRan f k) e)) --- catchError :: Ran (Either e) a -> (e -> Ran (Either e) a -> Ran (Either e) a -Ranm`catchError`h=Ran(\k->ErrorH(\z->getErrorH(mk)(\e->getErrorH(getRan(he)k)z))) - -instanceErrore=>MonadPlus(Ran(Eithere))where -mzero=throwErrornoMsg -Ranm`mplus`Rann=Ran(\k->ErrorH(\z->getErrorH(mk)(\_->getErrorH(nk)z))) +instance(Eqa,Eqb)=>Eq(Ran(Eithera)b)where +f==g=lowerRanf==lowerRang + +instance(Orda,Ordb)=>Ord(Ran(Eithera)b)where +f`compare`g=lowerRanf`compare`lowerRang + +instance(Showa,Showb)=>Show(Ran(Eithera)b)where +showsPrecdf=showParen(d>10)$ +showString"liftRan ".showsPrec11(lowerRanf) + +instance(Reada,Readb)=>Read(Ran(Eithera)b)where +readPrec=parens$prec10$do +Ident"liftRan"<-lexP +m<-stepreadPrec +return(liftRanm) + + +-- Yoneda (Reader r) ~ forall o. (a -> o) -> r -> o ~ forall o. (a -> Identity o) -> r -> o +instanceRanIso((->)e)where +typeG((->)e)=Identity +typeH((->)e)=(->)e +liftRanm=Ran(\f->liftM(runIdentity.f)m) +lowerRan(Ranf)=fIdentity + +instancePointed(Ran((->)e))where +point=return + +instanceApplicative(Ran((->)e))where +pure=return +Ranf<*>Rang=Ran(\kr->runIdentity(k(fIdentityr(gIdentityr)))) + +instanceMonad(Ran((->)e))where +returna=Ran(\f_->runIdentity(fa)) +Ranf>>=h=Ran(\kr->getRan(h(fIdentityr))kr) + +instanceMonadReadere(Ran((->)e))where +ask=Ran(\kr->runIdentity(kr)) +localf(Ranm)=Ran(\kr->mk(fr)) + +instanceMonoidm=>Monoid(Ran((->)e)m)where +mempty=returnmempty +Rana`mappend`Ranb=Ran(\kr->runIdentity(k(aIdentityr`mappend`bIdentityr))) + + +-- Yoneda (Reader r) ~ forall o. (a -> o) -> r -> o ~ forall o. (a -> Identity o) -> r -> o +instanceRanIso(Readere)where +typeG(Readere)=Identity +typeH(Readere)=Readere +liftRanm=Ran(\f->liftM(runIdentity.f)m) +lowerRan(Ranf)=fIdentity hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 469 -instanceErrore=>MonadFix(Ran(Eithere))where -mfixf=mwhere -m=f(fromRightm) -fromRight(Ranr)=getErrorH(rIdentity)(\_->error"mfix (Ran (Either e)): empty mfix argument") - -instance(Eqa,Eqb)=>Eq(Ran(Eithera)b)where -f==g=lowerRanf==lowerRang - -instance(Orda,Ordb)=>Ord(Ran(Eithera)b)where -f`compare`g=lowerRanf`compare`lowerRang - -instance(Showa,Showb)=>Show(Ran(Eithera)b)where -showsPrecdf=showParen(d>10)$ -showString"liftRan ".showsPrec11(lowerRanf) - -instance(Reada,Readb)=>Read(Ran(Eithera)b)where -readPrec=parens$prec10$do -Ident"liftRan "<-lexP -m<-stepreadPrec -return(liftRanm) - +instancePointed(Ran(Readere))where +point=return + +instanceApplicative(Ran(Readere))where +pure=return +Ranf<*>Rang=Ran(\k->Reader(\r->runIdentity(k(runReader(fIdentity)r(runReader(gIdentity)r))))) + +instanceMonad(Ran(Readere))where +returna=Ran(\f->Reader(\_->runIdentity(fa))) +Ranf>>=h=Ran(\k->Reader(\r->runReader(getRan(h(runReader(fIdentity)r))k)r)) + +instanceMonadReadere(Ran(Readere))where +ask=Ran(\k->Reader(\r->runIdentity(kr))) +localf(Ranm)=Ran(\k->Reader(\r->runReader(mk)(fr))) + +instanceMonoidm=>Monoid(Ran(Readere)m)where +mempty=returnmempty +Rana`mappend`Ranb=Ran(\k->Reader(\r->runIdentity(k(runReader(aIdentity)r`mappend`runReader(bIdentity)r)))) + + +-- Ran Transformers hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 491 --- Yoneda (Reader r) ~ forall o. (a -> o) -> r -> o ~ forall o. (a -> Identity o) -> r -> o -instanceRanIso((->)e)where -typeG((->)e)=Identity -typeH((->)e)=(->)e -liftRanm=Ran(\f->liftM(runIdentity.f)m) -lowerRan(Ranf)=fIdentity +-- ReaderT m a ~ forall o. (a -> G m o) -> ReaderT r (H m) o +instanceRanIsom=>RanIso(ReaderTem)where +typeG(ReaderTem)=Gm +typeH(ReaderTem)=e:->Hm +liftRan(ReaderTf)=Ran(\k->ReaderT(\e->getRan(liftRan(fe))k)) +lowerRan(Ranf)=ReaderT(\e->lowerRan(Ran(\k->runReaderT(fk)e))) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 498 -instancePointed(Ran((->)e))where -point=return - -instanceApplicative(Ran((->)e))where -pure=return -Ranf<*>Rang=Ran(\kr->runIdentity(k(fIdentityr(gIdentityr)))) - -instanceMonad(Ran((->)e))where -returna=Ran(\f_->runIdentity(fa)) -Ranf>>=h=Ran(\kr->getRan(h(fIdentityr))kr) - -instanceMonadReadere(Ran((->)e))where -ask=Ran(\kr->runIdentity(kr)) -localf(Ranm)=Ran(\kr->mk(fr)) - -instanceMonoidm=>Monoid(Ran((->)e)m)where -mempty=returnmempty -Rana`mappend`Ranb=Ran(\kr->runIdentity(k(aIdentityr`mappend`bIdentityr))) - +instanceRanTrans(ReaderTe)where +liftRanT(Ranm)=Ran(ReaderT.const.m) +outRan(Ranm)=ReaderT(\e->Ran(\k->runReaderT(mk)e)) +inRan(ReaderTf)=Ran(\k->ReaderT(\e->getRan(fe)k)) + +instanceRMonadm=>Pointed(Ran(ReaderTem))where +point=inRan.return + +instanceRMonadm=>Applicative(Ran(ReaderTem))where +pure=inRan.return +f<*>g=inRan(outRanf`ap`outRang) + +instance(RMonadm,MonadPlus(Ranm))=>Alternative(Ran(ReaderTem))where +empty=inRanmzero +f<|>g=inRan(outRanf`mplus`outRang) + +instanceRMonadm=>Monad(Ran(ReaderTem))where +return=inRan.return +m>>=f=inRan(outRanm>>=outRan.f) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 518 --- Yoneda (Reader r) ~ forall o. (a -> o) -> r -> o ~ forall o. (a -> Identity o) -> r -> o -instanceRanIso(Readere)where -typeG(Readere)=Identity -typeH(Readere)=Readere -liftRanm=Ran(\f->liftM(runIdentity.f)m) -lowerRan(Ranf)=fIdentity - -instancePointed(Ran(Readere))where -point=return - -instanceApplicative(Ran(Readere))where -pure=return -Ranf<*>Rang=Ran(\k->Reader(\r->runIdentity(k(runReader(fIdentity)r(runReader(gIdentity)r))))) - -instanceMonad(Ran(Readere))where -returna=Ran(\f->Reader(\_->runIdentity(fa))) -Ranf>>=h=Ran(\k->Reader(\r->runReader(getRan(h(runReader(fIdentity)r))k)r)) - -instanceMonadReadere(Ran(Readere))where -ask=Ran(\k->Reader(\r->runIdentity(kr))) -localf(Ranm)=Ran(\k->Reader(\r->runReader(mk)(fr))) - -instanceMonoidm=>Monoid(Ran(Readere)m)where -mempty=returnmempty -Rana`mappend`Ranb=Ran(\k->Reader(\r->runIdentity(k(runReader(aIdentity)r`mappend`runReader(bIdentity)r)))) +instance(RMonadm,MonadStates(Ranm))=>MonadStates(Ran(ReaderTem))where +get=inRanget +put=inRan.put + +instanceRMonadm=>MonadReaderr(Ran(ReaderTrm))where +ask=inRan(ReaderTreturn) +localf=inRan.localf.outRan + +instance(RMonadm,MonadWriterw(Ranm))=>MonadWriterw(Ran(ReaderTem))where +tell=inRan.tell +listen=inRan.listen.outRan +pass=inRan.pass.outRan + +instance(RMonadm,MonadIO(Ranm))=>MonadIO(Ran(ReaderTem))where +liftIO=inRan.liftIO + +instance(RMonadm,MonadPlus(Ranm))=>MonadPlus(Ran(ReaderTem))where +mzero=inRanmzero +a`mplus`b=inRan(outRana`mplus`outRanb) + +instance(RMonadm,MonadFix(Ranm))=>MonadFix(Ran(ReaderTem))where +mfixf=inRan$mfix(outRan.f) + +-- TODO: instance MonadError (ReaderT e m), MonadCont (ReaderT e m), MonadFix (ReaderT e m), ... +-- MonadPlus (ReaderT e m), MonadFix (ReaderT e m) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 545 --- Ran Transformers +-- | @ErrorT e (Ran_g h) a = Ran_g (ErrorTH e h) a@ hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 547 --- ReaderT m a ~ forall o. (a -> G m o) -> ReaderT r (H m) o -instanceRanIsom=>RanIso(ReaderTem)where -typeG(ReaderTem)=Gm -typeH(ReaderTem)=e:->Hm -liftRan(ReaderTf)=Ran(\k->ReaderT(\e->getRan(liftRan(fe))k)) -lowerRan(Ranf)=ReaderT(\e->lowerRan(Ran(\k->runReaderT(fk)e))) - -instanceRanTrans(ReaderTe)where -liftRanT(Ranm)=Ran(ReaderT.const.m) -outRan(Ranm)=ReaderT(\e->Ran(\k->runReaderT(mk)e)) -inRan(ReaderTf)=Ran(\k->ReaderT(\e->getRan(fe)k)) - -instanceRMonadm=>Pointed(Ran(ReaderTem))where -point=inRan.return - -instanceRMonadm=>Applicative(Ran(ReaderTem))where -pure=inRan.return -f<*>g=inRan(outRanf`ap`outRang) +-- m (Either a b) ~ (Either a b -> G m o) -> H m o ~ forall o. (a -> G m o) -> (b -> G m o) -> H m o +dataErrorTHemo=ErrorTH{getErrorTH::(e->Gmo)->Hmo} +instance(RanIsom,Errore)=>RanIso(ErrorTem)where +typeG(ErrorTem)=Gm +typeH(ErrorTem)=ErrorTHem +liftRan(ErrorTm)=Ran(\k->ErrorTH(\e->getRan(liftRanm)(eitherek))) +lowerRan(Ranm)=ErrorT(lowerRan(Ran(\k->getErrorTH(m(k.Right))(k.Left)))) + +unwrapErrorT::(RanIsom)=>Ran(ErrorTam)b->Ranm(Eitherab) +unwrapErrorT(Ranm)=Ran(\k->getErrorTH(m(k.Right))(k.Left)) + +wrapErrorT::(RanIsom)=>Ranm(Eitherab)->Ran(ErrorTam)b +wrapErrorT(Ranm)=Ran(\k->ErrorTH(\e->m(eitherek))) + +instanceRanTrans(ErrorTe)where +liftRanT(Ranm)=Ran(\k->ErrorTH(\_->mk)) +outRan(Ranm)=ErrorT(Ran(\k->getErrorTH(m(k.Right))(k.Left))) +inRan(ErrorTm)=Ran(\k->ErrorTH(\e->getRanm(eitherek))) hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 566 -instance(RMonadm,MonadPlus(Ranm))=>Alternative(Ran(ReaderTem))where -empty=inRanmzero -f<|>g=inRan(outRanf`mplus`outRang) - -instanceRMonadm=>Monad(Ran(ReaderTem))where -return=inRan.return -m>>=f=inRan(outRanm>>=outRan.f) - -instance(RMonadm,MonadStates(Ranm))=>MonadStates(Ran(ReaderTem))where -get=inRanget -put=inRan.put - -instanceRMonadm=>MonadReaderr(Ran(ReaderTrm))where -ask=inRan(ReaderTreturn) -localf=inRan.localf.outRan - -instance(RMonadm,MonadWriterw(Ranm))=>MonadWriterw(Ran(ReaderTem))where -tell=inRan.tell -listen=inRan.listen.outRan -pass=inRan.pass.outRan - -instance(RMonadm,MonadIO(Ranm))=>MonadIO(Ran(ReaderTem))where -liftIO=inRan.liftIO - -instance(RMonadm,MonadPlus(Ranm))=>MonadPlus(Ran(ReaderTem))where -mzero=inRanmzero -a`mplus`b=inRan(outRana`mplus`outRanb) +instance(RMonadm,Errore)=>Pointed(Ran(ErrorTem))where +point=inRan.return + +instance(RMonadm,Errore)=>Applicative(Ran(ErrorTem))where +pure=inRan.return +f<*>g=inRan(outRanf`ap`outRang) + +instance(RMonadm,Errore,MonadPlus(Ranm))=>Alternative(Ran(ErrorTem))where +empty=inRanmzero +f<|>g=inRan(outRanf`mplus`outRang) + +instance(RMonadm,Errore)=>Monad(Ran(ErrorTem))where +return=inRan.return +m>>=f=inRan(outRanm>>=outRan.f) + +instance(RMonadm,Errore,MonadStates(Ranm))=>MonadStates(Ran(ErrorTem))where +get=inRanget +put=inRan.put + +instance(RMonadm,Errore,MonadReaderr(Ranm))=>MonadReaderr(Ran(ErrorTem))where +ask=inRanask +localf=inRan.localf.outRan + +instance(RMonadm,Errore,MonadWriterw(Ranm))=>MonadWriterw(Ran(ErrorTem))where +tell=inRan.tell +listen=inRan.listen.outRan +pass=inRan.pass.outRan hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 594 -instance(RMonadm,MonadFix(Ranm))=>MonadFix(Ran(ReaderTem))where -mfixf=inRan$mfix(outRan.f) - --- TODO: instance MonadError (ReaderT e m), MonadCont (ReaderT e m), MonadFix (ReaderT e m), ... --- MonadPlus (ReaderT e m), MonadFix (ReaderT e m) - -unwrapErrorT::(RanIsom,Errora)=>Ran(ErrorTam)b->Ranm(Eitherab) -unwrapErrorT(Ranm)=Ran(\k->getErrorTH(m(k.Right))(k.Left)) - -wrapErrorT::(RanIsom,Errora)=>Ranm(Eitherab)->Ran(ErrorTam)b -wrapErrorT(Ranm)=Ran(\k->ErrorTH(\e->m(eitherek))) - --- m (Either a b) ~ (Either a b -> G m o) -> H m o ~ forall o. (a -> G m o) -> (b -> G m o) -> H m o -dataErrorTHemo=ErrorTH{getErrorTH::(e->Gmo)->Hmo} -instance(RanIsom,Errore)=>RanIso(ErrorTem)where -typeG(ErrorTem)=Gm -typeH(ErrorTem)=ErrorTHem -liftRan(ErrorTm)=Ran(\k->ErrorTH(\e->getRan(liftRanm)(eitherek))) -lowerRan(Ranm)=ErrorT(lowerRan(Ran(\k->getErrorTH(m(k.Right))(k.Left)))) - -instanceRanTrans(ErrorTe)where -liftRanT(Ranm)=Ran(\k->ErrorTH(\_->mk)) -outRan(Ranm)=ErrorT(Ran(\k->getErrorTH(m(k.Right))(k.Left))) -inRan(ErrorTm)=Ran(\k->ErrorTH(\e->getRanm(eitherek))) - -instance(RMonadm,Errore)=>Pointed(Ran(ErrorTem))where -point=inRan.return - -instance(RMonadm,Errore)=>Applicative(Ran(ErrorTem))where -pure=inRan.return -f<*>g=inRan(outRanf`ap`outRang) - -instance(RMonadm,Errore,MonadPlus(Ranm))=>Alternative(Ran(ErrorTem))where -empty=inRanmzero -f<|>g=inRan(outRanf`mplus`outRang) +instance(RMonadm,Errore,MonadRWSrws(Ranm))=>MonadRWSrws(Ran(ErrorTem)) + +instance(RMonadm,Errore,MonadIO(Ranm))=>MonadIO(Ran(ErrorTem))where +liftIO=inRan.liftIO + +instance(RMonadm,Errore,MonadFix(Ranm))=>MonadFix(Ran(ErrorTem))where +mfixf=inRan$mfix(outRan.f) + +instance(RanIsom,Eq(Ranm(Eitherab)))=>Eq(Ran(ErrorTam)b)where +f==g=unwrapErrorTf==unwrapErrorTg + +instance(RanIsom,Ord(Ranm(Eitherab)))=>Ord(Ran(ErrorTam)b)where +f`compare`g=unwrapErrorTf`compare`unwrapErrorTg + +instance(RanIsom,Show(Ranm(Eitherab)))=>Show(Ran(ErrorTam)b)where +showsPrecdf=showParen(d>10)$ +showString"wrapErrorT ".showsPrec11(unwrapErrorTf) + +instance(RanIsom,Read(Ranm(Eitherab)))=>Read(Ran(ErrorTam)b)where +readPrec=parens$prec10$do +Ident"wrapErrorT"<-lexP +m<-stepreadPrec +return(wrapErrorTm) + +{- +-- (a -> r) -> r +instance RMonad (Cont r) where + type G (Cont r) = Const r + type H (Cont r) = Const r + +-- forall o. (a -> w -> G m o) -> H m o +-- forall o. (a -> G m (w -> o)) -> H m (w -> o) ? +instance (Monoid w, RMonad m) => RMonad (WriterT w m) where + type G (WriterT w m) = w :-> G m + type H (WriterT w m) = H m hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 630 -instance (RMonad m, Error e) => Monad (Ran (ErrorT e m)) where - return = inRan . return - m >>= f = inRan (outRan m >>= outRan . f) - -instance (RMonad m, Error e, MonadState s (Ran m)) => MonadState s (Ran (ErrorT e m)) where - get = inRan get - put = inRan . put - -instance (RMonad m, Error e, MonadReader r (Ran m)) => MonadReader r (Ran (ErrorT e m)) where - ask = inRan ask - local f = inRan . local f . outRan - -instance (RMonad m, Error e, MonadWriter w (Ran m)) => MonadWriter w (Ran (ErrorT e m)) where - tell = inRan . tell - listen = inRan . listen . outRan - pass = inRan . pass . outRan - -instance (RMonad m, Error e, MonadRWS r w s (Ran m)) => MonadRWS r w s (Ran (ErrorT e m)) - -instance (RMonad m, Error e, MonadIO (Ran m)) => MonadIO (Ran (ErrorT e m)) where - liftIO = inRan . liftIO - -instance (RMonad m, Error e, MonadFix (Ran m)) => MonadFix (Ran (ErrorT e m)) where - mfix f = inRan $ mfix (outRan . f) -{- --- (a -> r) -> r -instance RMonad (Cont r) where - type G (Cont r) = Const r - type H (Cont r) = Const r - --- forall o. (a -> G m o) -> r -> H m o -instance RMonad m => RMonad (ReaderT e m) where - type G (ReaderT e m) = G m - type H (ReaderT e m) = e :-> H m - --- forall o. (a -> w -> G m o) -> H m o --- forall o. (a -> G m (w -> o)) -> H m (w -> o) ? -instance (Monoid w, RMonad m) => RMonad (WriterT w m) where - type G (WriterT w m) = w :-> G m - type H (WriterT w m) = H m - --- forall o. (a -> s -> G m o) -> s -> H m o --- forall o. (a -> G m (s -> o)) -> H m (s -> o) ? -instance RMonad m => RMonad (StateT s m) where - type G (StateT s m) = s :-> G m - type H (StateT s m) = s :-> H m +-- forall o. (a -> s -> G m o) -> s -> H m o +-- forall o. (a -> G m (s -> o)) -> H m (s -> o) ? +instance RMonad m => RMonad (StateT s m) where + type G (StateT s m) = s :-> G m + type H (StateT s m) = s :-> H m + +-- (a -> G m r) -> H m r +data ConstT r f a = ConstT { getConstT :: f r } +instance RMonad m => RMonad (ContT r m) where + type G (ContT r m) = ConstT r (G m) + type H (ContT r m) = ConstT r (H m) +-} + + +-- | A pointed functor is a functor with a discriminated family of f-coalgebras +class Functor f => Pointed f where + point :: a -> f a + +instance Pointed Maybe where point = Just +instance Pointed [] where point = return +instance Pointed (Cont r) where point = return +instance Monad m => Pointed (ContT r m) where point = return +instance Pointed Identity where point = Identity +instance Pointed (Either a) where point = Right +instance (Error e, Monad m) => Pointed (ErrorT e m) where point = return +instance Pointed (Reader r) where point = return +instance Monad m => Pointed (ReaderT r m) where point = return +instance Pointed ((->)r) where point = return +instance Pointed (SS.State w) where point = return +instance Pointed (State w) where point = return +instance Monad m => Pointed (SS.StateT w m) where point = return +instance Monad m => Pointed (StateT w m) where point = return +instance Monoid w => Pointed (SW.Writer w) where point = return +instance Monoid w => Pointed (Writer w) where point = return +instance (Monoid w, Monad m) => Pointed (SW.WriterT w m) where point = return +instance (Monoid w, Monad m) => Pointed (WriterT w m) where point = return +instance Monoid w => Pointed (SR.RWS r w s) where point = return +instance Monoid w => Pointed (RWS r w s) where point = return +instance (Monoid w, Monad m) => Pointed (SR.RWST r w s m) where point = return +instance (Monoid w, Monad m) => Pointed (RWST r w s m) where point = return +instance Monad m => Pointed (ListT m) where point = return + + +-- | The Codensity monad of a functor/monad generated by a functor + +data Codensity f a = Codensity { getCodensity :: forall b. (a -> f b) -> f b } hunk ./doc/html/monad-ran/src/Control-Monad-Ran.html 677 --- (a -> G m r) -> H m r -data ConstT r f a = ConstT { getConstT :: f r } -instance RMonad m => RMonad (ContT r m) where - type G (ContT r m) = ConstT r (G m) - type H (ContT r m) = ConstT r (H m) --} - +instanceFunctor(Codensityk)where +fmapfm=Codensity(\k->getCodensitym(k.f)) + +instancePointed(Codensityf)where +pointx=Codensity(\k->kx) + +instanceApplicative(Codensityf)where +purex=Codensity(\k->kx) +Codensityf<*>Codensityx=Codensity(\k->f(\f'->x(k.f'))) + +instanceMonad(Codensityf)where +returnx=Codensity(\k->kx) +Codensitym>>=k=Codensity +(\c->m(\a->getCodensity(ka)c)) + +instanceMonadIOm=>MonadIO(Codensitym)where +liftIO=lift.liftIO + +instanceMonadPlusm=>MonadPlus(Codensitym)where +mzero=Codensity(constmzero) +a`mplus`b=lift(lowerCodensitya`mplus`lowerCodensityb) + +instanceMonadReaderrm=>MonadReaderr(Codensitym)where +ask=liftask +localfm=Codensity(\c->dor<-ask;localf(getCodensitym(local(constr).c))) + +instanceMonadWriterwm=>MonadWriterw(Codensitym)where +tell=lift.tell +listen=lift.listen.lowerCodensity +pass=lift.pass.lowerCodensity + +instanceMonadStatesm=>MonadStates(Codensitym)where +get=liftget +put=lift.put + +instanceMonadRWSrwsm=>MonadRWSrws(Codensitym) + +instanceMonadFixf=>MonadFix(Codensityf)where +mfixf=lift$mfix(lowerCodensity.f) + +instanceMonadErrorem=>MonadErrore(Codensitym)where +throwError=lift.throwError +f`catchError`h=lift$lowerCodensityf`catchError`(lowerCodensity.h) + +instanceMonadTransCodensitywhere +liftm=Codensity(m>>=) + +lowerCodensity::Monadm=>Codensityma->ma +lowerCodensity=flipgetCodensityreturn + +lowerCodensityApp::Applicativef=>Codensityfa->fa +lowerCodensityApp=flipgetCodensitypure + +lowerCodensityPointed::Applicativef=>Codensityfa->fa +lowerCodensityPointed=flipgetCodensitypure + +-- The codensity monad as a right Kan extension of a functor along itself +-- Many state-like monads can be CPS transformed into a codensity monad. +instanceRanIso(Codensityf)where +typeG(Codensityf)=f +typeH(Codensityf)=f +liftRan=codensityRan +lowerRan=ranCodensity + +ranCodensity::Ran(Codensityf)a->Codensityfa +ranCodensity(Ranf)=Codensityf + +codensityRan::Codensityfa->Ran(Codensityf)a +codensityRan(Codensityf)=Ranf + +instancePointed(Ran(Codensityf))where +point=returnRanCodensity + +instanceApplicative(Ran(Codensityf))where +pure=returnRanCodensity +(<*>)=apRanCodensity + +instanceMonad(Ran(Codensityf))where +return=returnRanCodensity +(>>=)=bindRanCodensity + +instanceAlternative(Codensityf)=>Alternative(Ran(Codensityf))where +empty=liftRanempty +m<|>n=liftRan(lowerRanm<|>lowerRann) + +instanceMonadPlusf=>MonadPlus(Ran(Codensityf))where +mzero=liftRanmzero +m`mplus`n=liftRan(lowerRanm`mplus`lowerRann) + +instanceMonadIOf=>MonadIO(Ran(Codensityf))where +liftIOf=Ran(liftIOf>>=) + +instanceMonadStatesm=>MonadStates(Ran(Codensitym))where +get=Ran(get>>=) +puts=Ran(puts>>=) + +instanceMonadWriterwm=>MonadWriterw(Ran(Codensitym))where +tellw=Ran(tellw>>=) +listen=liftRanCodensity.listen.lowerRanCodensity +pass=liftRanCodensity.pass.lowerRanCodensity + +instanceMonadReaderrm=>MonadReaderr(Ran(Codensitym))where +ask=Ran(ask>>=) +localf=liftRanCodensity.localf.lowerRanCodensity + +instanceMonadRWSrwsm=>MonadRWSrws(Ran(Codensitym)) + +instanceMonadFixm=>MonadFix(Ran(Codensitym))where +mfixf=liftRanCodensity$mfix(lowerRanCodensity.f) + +instanceMonadErrorem=>MonadErrore(Ran(Codensitym))where +throwErrore=Ran(throwErrore>>=) +m`catchError`h=liftRanCodensity(lowerRanCodensitym`catchError`(lowerRanCodensity.h)) + + + +-- | The Covariant Yoneda lemma applied to a functor. Note that @f@ need not be a Hask 'Functor'! + +dataYonedafa=Yoneda{getYoneda::forallb.(a->b)->fb} + +lowerYoneda::Yonedafa->fa +lowerYoneda(Yonedaf)=fid + +instanceFunctor(Yonedaf)where +fmapfm=Yoneda(\k->getYonedam(k.f)) + +instancePointedf=>Pointed(Yonedaf)where +pointa=Yoneda(\f->point(fa)) + +instanceApplicativef=>Applicative(Yonedaf)where +purea=Yoneda(\f->pure(fa)) +m<*>n=Yoneda(\f->getYonedam(f.)<*>getYonedanid) + +instanceAlternativef=>Alternative(Yonedaf)where +empty=Yoneda(constempty) +Yonedam<|>Yonedan=Yoneda(\f->mf<|>nf) + +instanceMonadf=>Monad(Yonedaf)where +returna=Yoneda(\f->return(fa)) +m>>=k=Yoneda(\f->getYonedamid>>=\a->getYoneda(ka)f) + +instanceMonadPlusf=>MonadPlus(Yonedaf)where +mzero=Yoneda(constmzero) +Yonedam`mplus`Yonedan=Yoneda(\f->mf`mplus`nf) + +instanceMonadTransYonedawhere +liftm=Yoneda(\f->liftMfm) + +instanceMonadReaderrf=>MonadReaderr(Yonedaf)where +ask=liftask +localf=lift.localf.lowerYoneda + +instanceMonadWriterwf=>MonadWriterw(Yonedaf)where +tell=lift.tell +listen=lift.listen.lowerYoneda +pass=lift.pass.lowerYoneda + +instanceMonadStatesf=>MonadStates(Yonedaf)where +get=liftget +put=lift.put + +instanceMonadIOf=>MonadIO(Yonedaf)where +liftIO=lift.liftIO + +instanceMonadRWSrwsf=>MonadRWSrws(Yonedaf) + +instanceMonadErroref=>MonadErrore(Yonedaf)where +throwError=lift.throwError +catchErrormh=lift$lowerYonedam`catchError`(lowerYoneda.h) + +instanceMonadFixm=>MonadFix(Yonedam)where +mfixf=lift$mfix(lowerYoneda.f) + + }
Control.Monad.Yoneda