yaya-0.2.0.0: src/Yaya/Functor.hs
-- | This should probably be a separate library, but it provides a number of
-- functor type classes between various categories.
module Yaya.Functor where
import Data.Bifunctor
-- | A functor from the category of endofunctors to *Hask*. The `D` is meant to
-- be a mnemonic for “down”, as we’re “lowering” from endofunctors to types.
class DFunctor (d :: (* -> *) -> *) where
dmap :: (forall a. f a -> g a) -> d f -> d g
-- | This isn’t a Functor instance because of the position of the `a`, but you
-- can use it like:
-- > newtype List a = List (Mu (XNor a))
-- > instance Functor List where
-- > map f (List mu) = List (firstMap f mu)
firstMap :: (DFunctor d, Bifunctor f) => (a -> b) -> d (f a) -> d (f b)
firstMap f = dmap (first f)
-- | An endofunctor in the category of endofunctors.
class HFunctor (h :: (* -> *) -> * -> *) where
hmap :: (forall a. f a -> g a) -> h f a -> h g a