kan-extensions-5.0.2: Kan extensions, Kan lifts, various forms of the Yoneda lemma, and (co)density (co)monads

Copyright(C) 2014-2016 Edward Kmett
LicenseBSD-style (see the file LICENSE)
MaintainerEdward Kmett <ekmett@gmail.com>
Stabilityprovisional
Portabilityportable
Safe HaskellNone
LanguageHaskell98

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 #

The Day convolution of two covariant functors.

Day f g a -> h a is isomorphic to f a -> Rift g h a

Constructors

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

Instances

Comonad f => ComonadTrans (Day f) # 

Methods

lower :: Comonad w => Day f w a -> w a #

Functor (Day f g) # 

Methods

fmap :: (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) # 

Methods

pure :: a -> Day f g a #

(<*>) :: 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 #

(Representable f, Representable g) => Distributive (Day f g) # 

Methods

distribute :: 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) # 

Associated Types

type Rep (Day f g :: * -> *) :: * #

Methods

tabulate :: (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) # 

Methods

extract :: 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) # 

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) # 
type Rep (Day f g) = (Rep f, Rep g)

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

Construct the Day convolution

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

Collapse via a monoidal functor.

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

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

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 #

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 #

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 #

Identity is the unit of Day convolution

intro1 . elim1 = id
elim1 . intro1 = id

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

Identity is the unit of Day convolution

intro2 . elim2 = id
elim2 . intro2 = id

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

Identity is the unit of Day convolution

intro1 . elim1 = id
elim1 . intro1 = id

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

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 #

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 #

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