{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
module Data.Functor.Adjoint where

class (Functor f, Functor g) => Adjoint f g | f -> g, g -> f where
    unit :: a -> g (f a)
    counit :: f (g a) -> a
    leftAdjunct :: (f a -> b) -> a -> g b
    rightAdjunct :: (a -> g b) -> f a -> b