Copyright | 2008-2016 Edward Kmett |
---|---|
License | BSD |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | experimental |
Portability | rank 2 types |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
- 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 Source #
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
exists.gran
:: Ran g h (g a) -> h a
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.
toRan :: forall {k1} k2 g h b. Functor k2 => (forall (a :: k1). k2 (g a) -> h a) -> k2 b -> Ran g h b Source #
The universal property of a right Kan extension.
gran :: forall {k} g h (a :: k). Ran g h (g a) -> h a Source #
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 Source #
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 Source #
adjointToRan :: forall f (g :: Type -> Type) a. Adjunction f g => f a -> Ran g Identity a Source #
adjointToRan
.ranToAdjoint
≡id
ranToAdjoint
.adjointToRan
≡id
ranToAdjoint :: forall f (g :: Type -> Type) a. Adjunction f g => Ran g Identity a -> f a Source #
composedAdjointToRan :: forall f (g :: Type -> Type) h a. (Adjunction f g, Functor h) => h (f a) -> Ran g h a Source #
ranToComposedAdjoint :: forall f (g :: Type -> Type) h a. Adjunction f g => Ran g h a -> h (f a) Source #
repToRan :: forall (u :: Type -> Type) a. Representable u => Rep u -> a -> Ran u Identity a Source #
ranToRep :: forall (u :: Type -> Type) a. Representable u => Ran u Identity a -> (Rep u, a) Source #
composedRepToRan :: forall (u :: Type -> Type) h a. (Representable u, Functor h) => h (Rep u, a) -> Ran u h a Source #
ranToComposedRep :: forall (u :: Type -> Type) h a. Representable u => Ran u h a -> h (Rep u, a) Source #