category-extras-0.51.0: src/Control/Functor/Yoneda.hs
-------------------------------------------------------------------------------------------
-- |
-- Module : Control.Functor.Yoneda
-- Copyright : 2008 Edward Kmett
-- License : BSD
--
-- Maintainer : Edward Kmett <ekmett@gmail.com>
-- Stability : experimental
-- Portability : portable
--
-- The Yoneda lemma materialized as a Kan extension, and hence as a higher order functor
-------------------------------------------------------------------------------------------
module Control.Functor.Yoneda
( Yoneda
, toYoneda, fromYoneda
) where
import Control.Functor.KanExtension
import Control.Functor.Extras
import Control.Monad.Identity
type Yoneda = Ran Identity
toYoneda :: Functor f => f :~> Yoneda f
toYoneda a = Ran (\f -> fmap (runIdentity . f) a)
fromYoneda :: Yoneda f :~> f
fromYoneda t = runRan t Identity
-- newtype Yoneda f a = Yoneda { runYoneda :: forall b. (a -> b) -> f b }
-- instance HFunctor Yoneda where
-- ffmap f (Yoneda t) = check (t f)
-- hfmap f (Yoneda t) = Yoneda (f . t)