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

Copyright | (C) 2008-2016 Edward Kmett
License | BSD-style (see the file LICENSE)
Maintainer | Edward Kmett <ekmett@gmail.com>
Stability | experimental
Portability | non-portable (GADTs, MPTCs)
Safe Haskell | Safe
Language | Haskell98

Control.Comonad.Density

Description

The `Density` `Comonad` for a `Functor` (aka the 'Comonad generated by a `Functor`) The `Density` term dates back to Dubuc''s 1974 thesis. The term `Monad` genererated by a `Functor` dates back to 1972 in Street''s ''Formal Theory of Monads''.

The left Kan extension of a `Functor` along itself (``Lan` f f`) forms a `Comonad`. This is that `Comonad`.

Synopsis

- data Density k a where
  - Density :: (k b -> a) -> k b -> Density k a
- liftDensity :: Comonad w => w a -> Density w a
- densityToAdjunction :: Adjunction f g => Density f a -> f (g a)
- adjunctionToDensity :: Adjunction f g => f (g a) -> Density f a
- densityToLan :: Density f a -> Lan f f a
- lanToDensity :: Lan f f a -> Density f a

# Documentation

data Density k a where #

Constructors

Density :: (k b -> a) -> k b -> Density k a |

Instances

ComonadTrans Density # |
Methods lower :: Comonad w => Density w a -> w a #
Functor (Density f) # |
Methods fmap :: (a -> b) -> Density f a -> Density f b # (<$) :: a -> Density f b -> Density f a #
Applicative f => Applicative (Density f) # |
Methods pure :: a -> Density f a # (<*>) :: Density f (a -> b) -> Density f a -> Density f b # (*>) :: Density f a -> Density f b -> Density f b # (<*) :: Density f a -> Density f b -> Density f a #
Comonad (Density f) # |
Methods extract :: Density f a -> a # duplicate :: Density f a -> Density f (Density f a) # extend :: (Density f a -> b) -> Density f a -> Density f b #
Apply f => Apply (Density f) # |
Methods (<.>) :: Density f (a -> b) -> Density f a -> Density f b # (.>) :: Density f a -> Density f b -> Density f b # (<.) :: Density f a -> Density f b -> Density f a #
Extend (Density f) # |
Methods duplicated :: Density f a -> Density f (Density f a) # extended :: (Density f a -> b) -> Density f a -> Density f b #

liftDensity :: Comonad w => w a -> Density w a #

The natural transformation from a ``Comonad` w` to the `Comonad` generated by `w` (forwards).

This is merely a right-inverse (section) of `lower`, rather than a full inverse.

    lower . liftDensity ≡ id

densityToAdjunction :: Adjunction f g => Density f a -> f (g a) #

The Density `Comonad` of a left adjoint is isomorphic to the `Comonad` formed by that `Adjunction`.

This isomorphism is witnessed by `densityToAdjunction` and `adjunctionToDensity`.

    densityToAdjunction . adjunctionToDensity ≡ id
    adjunctionToDensity . densityToAdjunction ≡ id

adjunctionToDensity :: Adjunction f g => f (g a) -> Density f a #

densityToLan :: Density f a -> Lan f f a #

lanToDensity :: Lan f f a -> Density f a #

The `Density` `Comonad` of a `Functor` `f` is obtained by taking the left Kan extension (`Lan`) of `f` along itself. This isomorphism is witnessed by `lanToDensity` and `densityToLan`

    lanToDensity . densityToLan ≡ id
    densityToLan . lanToDensity ≡ id