data-category-0.4: Data/Category/Yoneda.hs
{-# LANGUAGE TypeOperators, TypeFamilies #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Category.Yoneda
-- Copyright : (c) Sjoerd Visscher 2010
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : sjoerd@w3future.com
-- Stability : experimental
-- Portability : non-portable
-----------------------------------------------------------------------------
module Data.Category.Yoneda where
import Prelude (($))
import Data.Category
import Data.Category.Functor
import Data.Category.NaturalTransformation
import Data.Category.CartesianClosed
-- The Yoneda emedding is just the Hom functor in curried form:
-- curry (CatA Id) (CatA Id) (CatA Id) (CatA Hom)
-- leftAdjunct (curryAdj (CatA Id)) (CatA Id) (CatA Hom)
-- (ExponentialWith (CatA Id) % (CatA Hom)) . (tuple (CatA Id) (CatA Id))
-- CatA (Wrap Hom Id) . CatA CatTuple
-- CatA (Postcompose Hom :.: CatTuple)
-- | The Yoneda embedding functor.
yonedaEmbedding :: Category (~>) => Postcompose (Hom (~>)) (~>) :.: CatTuple (~>) (Op (~>))
yonedaEmbedding = Postcompose Hom :.: CatTuple
data Yoneda f = Yoneda
type instance Dom (Yoneda f) = Dom f
type instance Cod (Yoneda f) = (->)
type instance Yoneda f :% a = Nat (Dom f) (->) (a :*-: Dom f) f
instance Functor f => Functor (Yoneda f) where
Yoneda % ab = \n -> n . yonedaEmbedding % Op ab
fromYoneda :: (Functor f, Cod f ~ (->)) => f -> Yoneda f :~> f
fromYoneda f = Nat Yoneda f $ \a n -> (n ! a) a
toYoneda :: (Functor f, Cod f ~ (->)) => f -> f :~> Yoneda f
toYoneda f = Nat f Yoneda $ \a fa -> Nat (homX_ a) f $ \_ h -> (f % h) fa
-- Contravariant Yoneda:
-- type instance Yoneda f :% a = Nat (Op (Dom f)) (->) (Dom f :-*: a) f