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

Copyright | 2008-2016 Edward Kmett
License | BSD
Maintainer | Edward Kmett <ekmett@gmail.com>
Stability | experimental
Portability | rank 2 types
Safe Haskell | Trustworthy
Language | Haskell2010

Data.Functor.Kan.Ran

Description

- Right Kan Extensions

Synopsis

- newtype Ran (g :: k -> Type) (h :: k -> Type) a = Ran {
  - runRan :: forall (b :: k). (a -> g b) -> h b
  }
- toRan :: forall {k1} k2 g h b. Functor k2 => (forall (a :: k1). k2 (g a) -> h a) -> k2 b -> Ran g h b
- fromRan :: forall {k1} k2 g h (b :: k1). (forall a. k2 a -> Ran g h a) -> k2 (g b) -> h b
- gran :: forall {k} g h (a :: k). Ran g h (g a) -> h a
- composeRan :: forall (compose :: (Type -> Type) -> (Type -> Type) -> Type -> Type) (f :: Type -> Type) (g :: Type -> Type) (h :: Type -> Type) a. Composition compose => Ran f (Ran g h) a -> Ran (compose f g) h a
- decomposeRan :: forall (compose :: (Type -> Type) -> (Type -> Type) -> Type -> Type) (f :: Type -> Type) (g :: Type -> Type) (h :: Type -> Type) a. (Composition compose, Functor f) => Ran (compose f g) h a -> Ran f (Ran g h) a
- adjointToRan :: forall f (g :: Type -> Type) a. Adjunction f g => f a -> Ran g Identity a
- ranToAdjoint :: forall f (g :: Type -> Type) a. Adjunction f g => Ran g Identity a -> f a
- composedAdjointToRan :: forall f (g :: Type -> Type) h a. (Adjunction f g, Functor h) => h (f a) -> Ran g h a
- ranToComposedAdjoint :: forall f (g :: Type -> Type) h a. Adjunction f g => Ran g h a -> h (f a)
- repToRan :: forall (u :: Type -> Type) a. Representable u => Rep u -> a -> Ran u Identity a
- ranToRep :: forall (u :: Type -> Type) a. Representable u => Ran u Identity a -> (Rep u, a)
- composedRepToRan :: forall (u :: Type -> Type) h a. (Representable u, Functor h) => h (Rep u, a) -> Ran u h a
- ranToComposedRep :: forall (u :: Type -> Type) h a. Representable u => Ran u h a -> h (Rep u, a)

# Documentation

newtype Ran (g :: k -> Type) (h :: k -> Type) a #

The right Kan extension of a `Functor` h along a `Functor` g.

We can define a right Kan extension in several ways. The definition here is obtained by reading off the definition in of a right Kan extension in terms of an End, but we can derive an equivalent definition from the universal property.

Given a `Functor` `h : C -> D` and a `Functor` `g : C -> C'`, we want to extend `h` back along `g` to give `Ran g h : C' -> D`, such that the natural transformation ``gran` :: Ran g h (g a) -> h a` exists.

In some sense this is trying to approximate the inverse of `g` by using one of its adjoints, because if the adjoint and the inverse both exist, they match!

    Hask -h-> Hask
      |       +
      g      /
      |    Ran g h
      v    /
    Hask -'

The Right Kan extension is unique (up to isomorphism) by taking this as its universal property.

That is to say given any `K : C' -> D` such that we have a natural transformation from `k.g` to `h` `(forall x. k (g x) -> h x)` there exists a canonical natural transformation from `k` to `Ran g h`. `(forall x. k x -> Ran g h x)`.

We could literally read this off as a valid Rank-3 definition for `Ran`:

    data Ran' g h a = forall z. Functor z => Ran' (forall x. z (g x) -> h x) (z a)

This definition is isomorphic the simpler Rank-2 definition we use below as witnessed by the

    ranIso1 :: Ran g f x -> Ran' g f x
    ranIso1 (Ran e) = Ran' e id

    ranIso2 :: Ran' g f x -> Ran g f x
    ranIso2 (Ran' h z) = Ran $ \k -> h (k <$> z)

    ranIso2 (ranIso1 (Ran e)) ≡ -- by definition
    ranIso2 (Ran' e id) ≡       -- by definition
    Ran $ \k -> e (k <$> id)    -- by definition
    Ran $ \k -> e (k . id)      -- f . id = f
    Ran $ \k -> e k             -- eta reduction
    Ran e

The other direction is left as an exercise for the reader.

Constructors

Ran |
Fields runRan :: forall (b :: k). (a -> g b) -> h b

#### Instances

Instances details

Functor (Ran g h) # |
Instance details Defined in Data.Functor.Kan.Ran Methods fmap :: (a -> b) -> Ran g h a -> Ran g h b # (<$) :: a -> Ran g h b -> Ran g h a #

toRan :: forall {k1} k2 g h b. Functor k2 => (forall (a :: k1). k2 (g a) -> h a) -> k2 b -> Ran g h b #

The universal property of a right Kan extension.

fromRan :: forall {k1} k2 g h (b :: k1). (forall a. k2 a -> Ran g h a) -> k2 (g b) -> h b #

`toRan` and `fromRan` witness a higher kinded adjunction. from `(``Compose'` g)` to ``Ran` g`

    toRan . fromRan ≡ id
    fromRan . toRan ≡ id

gran :: forall {k} g h (a :: k). Ran g h (g a) -> h a #

This is the natural transformation that defines a Right Kan extension.

composeRan :: forall (compose :: (Type -> Type) -> (Type -> Type) -> Type -> Type) (f :: Type -> Type) (g :: Type -> Type) (h :: Type -> Type) a. Composition compose => Ran f (Ran g h) a -> Ran (compose f g) h a #

    composeRan . decomposeRan ≡ id
    decomposeRan . composeRan ≡ id

decomposeRan :: forall (compose :: (Type -> Type) -> (Type -> Type) -> Type -> Type) (f :: Type -> Type) (g :: Type -> Type) (h :: Type -> Type) a. (Composition compose, Functor f) => Ran (compose f g) h a -> Ran f (Ran g h) a #

adjointToRan :: forall f (g :: Type -> Type) a. Adjunction f g => f a -> Ran g Identity a #

    adjointToRan . ranToAdjoint ≡ id
    ranToAdjoint . adjointToRan ≡ id

ranToAdjoint :: forall f (g :: Type -> Type) a. Adjunction f g => Ran g Identity a -> f a #

composedAdjointToRan :: forall f (g :: Type -> Type) h a. (Adjunction f g, Functor h) => h (f a) -> Ran g h a #

ranToComposedAdjoint :: forall f (g :: Type -> Type) h a. Adjunction f g => Ran g h a -> h (f a) #

    composedAdjointToRan . ranToComposedAdjoint ≡ id
    ranToComposedAdjoint . composedAdjointToRan ≡ id

repToRan :: forall (u :: Type -> Type) a. Representable u => Rep u -> a -> Ran u Identity a #

ranToRep :: forall (u :: Type -> Type) a. Representable u => Ran u Identity a -> (Rep u, a) #

composedRepToRan :: forall (u :: Type -> Type) h a. (Representable u, Functor h) => h (Rep u, a) -> Ran u h a #

ranToComposedRep :: forall (u :: Type -> Type) h a. Representable u => Ran u h a -> h (Rep u, a) #