{-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeOperators #-} module Data.Profunctor.Monad where import Data.Profunctor class ProfunctorFunctor t where promap :: Profunctor p => (p :-> q) -> t p :-> t q class ProfunctorFunctor t => ProfunctorMonad t where proreturn :: Profunctor p => p :-> t p projoin :: Profunctor p => t (t p) :-> t p class ProfunctorFunctor t => ProfunctorComonad t where proextract :: Profunctor p => t p :-> p produplicate :: Profunctor p => t p :-> t (t p)