{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
-- {-# LANGUAGE RankNTypes #-}
-- {-# LANGUAGE TypeSynonymInstances #-}
-- Functors parameterised over the morphisms in the source category
module Control.GFunctor where
infixl 8 <$$>
-- class ContravariantFunctor f where
-- cmap :: (b -> a) -> f a -> f b
--
class GFunctor f m where
gmap :: m a b -> f a -> f b
instance (Functor a) => GFunctor a (->) where
gmap = fmap
(<$$>) :: GFunctor f m =>m a b -> f a -> f b
(<$$>) = gmap
-- class GFunctor f m => GApplicative f m where
-- gpure :: a -> f a
-- (<**>) :: f (m a b) -> f a -> f b