kan-extensions-5.1: Kan extensions, Kan lifts, the Yoneda lemma, and (co)density (co)monads

Data.Functor.Day

Description

Eitan Chatav first introduced me to this construction

The Day convolution of two covariant functors is a covariant functor.

Day convolution is usually defined in terms of contravariant functors, however, it just needs a monoidal category, and Hask^op is also monoidal.

Day convolution can be used to nicely describe monoidal functors as monoid objects w.r.t this product.

http://ncatlab.org/nlab/show/Day+convolution

Synopsis

# Documentation

data Day f g a Source #

The Day convolution of two covariant functors.

Constructors

 Day (f b) (g c) (b -> c -> a)

Instances

 Comonad f => ComonadTrans (Day f) Source # Methodslower :: Comonad w => Day f w a -> w a # Functor (Day f g) Source # Methodsfmap :: (a -> b) -> Day f g a -> Day f g b #(<\$) :: a -> Day f g b -> Day f g a # (Applicative f, Applicative g) => Applicative (Day f g) Source # Methodspure :: a -> Day f g a #(<*>) :: Day f g (a -> b) -> Day f g a -> Day f g b #liftA2 :: (a -> b -> c) -> Day f g a -> Day f g b -> Day f g c #(*>) :: Day f g a -> Day f g b -> Day f g b #(<*) :: Day f g a -> Day f g b -> Day f g a # (Representable f, Representable g) => Distributive (Day f g) Source # Methodsdistribute :: Functor f => f (Day f g a) -> Day f g (f a) #collect :: Functor f => (a -> Day f g b) -> f a -> Day f g (f b) #distributeM :: Monad m => m (Day f g a) -> Day f g (m a) #collectM :: Monad m => (a -> Day f g b) -> m a -> Day f g (m b) # (Representable f, Representable g) => Representable (Day f g) Source # Associated Typestype Rep (Day f g :: * -> *) :: * # Methodstabulate :: (Rep (Day f g) -> a) -> Day f g a #index :: Day f g a -> Rep (Day f g) -> a # (Comonad f, Comonad g) => Comonad (Day f g) Source # Methodsextract :: Day f g a -> a #duplicate :: Day f g a -> Day f g (Day f g a) #extend :: (Day f g a -> b) -> Day f g a -> Day f g b # (ComonadApply f, ComonadApply g) => ComonadApply (Day f g) Source # Methods(<@>) :: Day f g (a -> b) -> Day f g a -> Day f g b #(@>) :: Day f g a -> Day f g b -> Day f g b #(<@) :: Day f g a -> Day f g b -> Day f g a # type Rep (Day f g) Source # type Rep (Day f g) = (Rep f, Rep g)

day :: f (a -> b) -> g a -> Day f g b Source #

Construct the Day convolution

dap :: Applicative f => Day f f a -> f a Source #

Collapse via a monoidal functor.

dap (day f g) = f <*> g


assoc :: Day f (Day g h) a -> Day (Day f g) h a Source #

Day convolution provides a monoidal product. The associativity of this monoid is witnessed by assoc and disassoc.

assoc . disassoc = id
disassoc . assoc = id
fmap f . assoc = assoc . fmap f


disassoc :: Day (Day f g) h a -> Day f (Day g h) a Source #

Day convolution provides a monoidal product. The associativity of this monoid is witnessed by assoc and disassoc.

assoc . disassoc = id
disassoc . assoc = id
fmap f . disassoc = disassoc . fmap f


swapped :: Day f g a -> Day g f a Source #

The monoid for Day convolution on the cartesian monoidal structure is symmetric.

fmap f . swapped = swapped . fmap f


intro1 :: f a -> Day Identity f a Source #

Identity is the unit of Day convolution

intro1 . elim1 = id
elim1 . intro1 = id


intro2 :: f a -> Day f Identity a Source #

Identity is the unit of Day convolution

intro2 . elim2 = id
elim2 . intro2 = id


elim1 :: Functor f => Day Identity f a -> f a Source #

Identity is the unit of Day convolution

intro1 . elim1 = id
elim1 . intro1 = id


elim2 :: Functor f => Day f Identity a -> f a Source #

Identity is the unit of Day convolution

intro2 . elim2 = id
elim2 . intro2 = id


trans1 :: (forall x. f x -> g x) -> Day f h a -> Day g h a Source #

Apply a natural transformation to the left-hand side of a Day convolution.

This respects the naturality of the natural transformation you supplied:

fmap f . trans1 fg = trans1 fg . fmap f


trans2 :: (forall x. g x -> h x) -> Day f g a -> Day f h a Source #

Apply a natural transformation to the right-hand side of a Day convolution.

This respects the naturality of the natural transformation you supplied:

fmap f . trans2 fg = trans2 fg . fmap f


cayley :: Procompose (Cayley f p) (Cayley g q) a b -> Cayley (Day f g) (Procompose p q) a b Source #

dayley :: Category p => Procompose (Cayley f p) (Cayley g p) a b -> Cayley (Day f g) p a b Source #

Proposition 4.1 from Pastro and Street