kan-extensions-5.2.5: Kan extensions, Kan lifts, the Yoneda lemma, and (co)density (co)monads
Copyright (C) 2011-2016 Edward Kmett
License BSD-style (see the file LICENSE)
Maintainer Edward Kmett <ekmett@gmail.com>
Stability provisional
Portability non-portable (rank-2 polymorphism)
Safe Haskell Safe-Inferred
Language Haskell2010

Control.Monad.Co

Description

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 .

Synopsis

Monads from Comonads

co :: Functor w => ( forall r. w (a -> r) -> r) -> Co w a Source #

runCo :: Functor w => Co w a -> w (a -> r) -> r Source #

Monad Transformers from Comonads

newtype CoT w m a Source #

Co w a ~ Rift w Identity a

Constructors

CoT

Fields

  • runCoT :: forall r. w (a -> m r) -> m r

Instances

Instances details
( Comonad w, MonadReader e m) => MonadReader e ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

ask :: CoT w m e Source #

local :: (e -> e) -> CoT w m a -> CoT w m a Source #

reader :: (e -> a) -> CoT w m a Source #

( Comonad w, MonadState s m) => MonadState s ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

get :: CoT w m s Source #

put :: s -> CoT w m () Source #

state :: (s -> (a, s)) -> CoT w m a Source #

( Comonad w, MonadWriter e m) => MonadWriter e ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

writer :: (a, e) -> CoT w m a Source #

tell :: e -> CoT w m () Source #

listen :: CoT w m a -> CoT w m (a, e) Source #

pass :: CoT w m (a, e -> e) -> CoT w m a Source #

( Comonad w, MonadError e m) => MonadError e ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

throwError :: e -> CoT w m a Source #

catchError :: CoT w m a -> (e -> CoT w m a) -> CoT w m a Source #

Comonad w => MonadTrans ( CoT w :: ( Type -> Type ) -> Type -> Type ) Source #
Instance details

Defined in Control.Monad.Co

Methods

lift :: Monad m => m a -> CoT w m a Source #

Comonad w => Monad ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

(>>=) :: CoT w m a -> (a -> CoT w m b) -> CoT w m b Source #

(>>) :: CoT w m a -> CoT w m b -> CoT w m b Source #

return :: a -> CoT w m a Source #

Functor w => Functor ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

fmap :: (a -> b) -> CoT w m a -> CoT w m b Source #

(<$) :: a -> CoT w m b -> CoT w m a Source #

( Comonad w, MonadFail m) => MonadFail ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Comonad w => Applicative ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

pure :: a -> CoT w m a Source #

(<*>) :: CoT w m (a -> b) -> CoT w m a -> CoT w m b Source #

liftA2 :: (a -> b -> c) -> CoT w m a -> CoT w m b -> CoT w m c Source #

(*>) :: CoT w m a -> CoT w m b -> CoT w m b Source #

(<*) :: CoT w m a -> CoT w m b -> CoT w m a Source #

( Comonad w, MonadIO m) => MonadIO ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Extend w => Apply ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

(<.>) :: CoT w m (a -> b) -> CoT w m a -> CoT w m b Source #

(.>) :: CoT w m a -> CoT w m b -> CoT w m b Source #

(<.) :: CoT w m a -> CoT w m b -> CoT w m a Source #

liftF2 :: (a -> b -> c) -> CoT w m a -> CoT w m b -> CoT w m c Source #

Extend w => Bind ( CoT w m) Source #
Instance details

Defined in Control.Monad.Co

Methods

(>>-) :: CoT w m a -> (a -> CoT w m b) -> CoT w m b Source #

join :: CoT w m ( CoT w m a) -> CoT w m a Source #

Klesili from CoKleisli

liftCoT0 :: Comonad w => ( forall a. w a -> s) -> CoT w m s Source #

liftCoT0M :: ( Comonad w, Monad m) => ( forall a. w a -> m s) -> CoT w m s Source #

lowerCoT0 :: ( Functor w, Monad m) => CoT w m s -> w a -> m s Source #

liftCoT1 :: ( forall a. w a -> a) -> CoT w m () Source #

liftCoT1M :: Monad m => ( forall a. w a -> m a) -> CoT w m () Source #

lowerCoT1 :: ( Functor w, Monad m) => CoT w m () -> w a -> m a Source #

dctrlM :: Monad m => ( forall a. w a -> m (w a)) -> CoT ( Density w) m () Source #

asksW :: ComonadEnv e w => (e -> a) -> CoT w m a Source #