Modulekan-extensions-5.2.7Haskell2010
Control.Monad.Co
Monads from Comonads
http://comonad.com/reader/2011/monads-from-comonads/
Co can be viewed as a right Kan lift along a Comonad.
In general you can "sandwich" a monad in between two halves of an adjunction.
That is to say, if you have an adjunction F -| G : C -> D then not only does GF
form a monad, but GMF forms a monad for M a monad in D. Therefore if we
have an adjunction F -| G : Hask -> Hask^op then we can lift a Comonad in Hask
which is a Monad in Hask^op to a Monad in Hask.
For any r, the Contravariant functor / presheaf (-> r) :: Hask^op -> Hask is adjoint to the "same"
Contravariant functor (-> r) :: Hask -> Hask^op. So we can sandwich a
Monad in Hask^op in the middle to obtain w (a -> r-) -> r+, and then take a coend over
r to obtain forall r. w (a -> r) -> r. This gives rise to Co. If we observe that
we didn't care what the choices we made for r were to finish this construction, we can
upgrade to forall r. w (a -> m r) -> m r in a manner similar to how ContT is constructed
yielding CoT.
We could consider unifying the definition of Co and Rift, but
there are many other arguments for which Rift can form a Monad, and this
wouldn't give rise to CoT.
- 2 types
- 18 values
- Packagekan-extensions-5.2.7
- Exports20
- LanguageHaskell2010
- LicenceBSD-3-Clause
- SourceCo.hs
Monads from Comonads
3 declarationsMonad Transformers from Comonads
1 declarationInstances12MonadError, MonadReader, MonadState, MonadWriter, MonadTrans, Monad, …
(Comonad w, MonadError e m) => MonadError e (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.Co(Comonad w, MonadReader e m) => MonadReader e (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.Co(Comonad w, MonadState s m) => MonadState s (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.Co(Comonad w, MonadWriter e m) => MonadWriter e (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.CoComonad w => MonadTrans (CoT w)Defined in kan-extensions-5.2.7 · Control.Monad.CoComonad w => Monad (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.CoFunctor w => Functor (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.Co(Comonad w, MonadFail m) => MonadFail (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.CoComonad w => Applicative (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.Co(Comonad w, MonadIO m) => MonadIO (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.CoExtend w => Apply (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.CoExtend w => Bind (CoT w m)Defined in kan-extensions-5.2.7 · Control.Monad.Co