{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PolyKinds #-} module Parameterized.Data.Monoid ( module Parameterized.Data.Semigroup , PMEmpty(..) , PMonoid ) where import Data.Kind import Parameterized.Data.Semigroup -- | Parameterized version of mempty in Monoid. class PMEmpty (n :: k -> Type) (id :: k) | n -> id where pmempty :: PNullary n id -- | Parameterized version of Monoid. class (PSemigroup n t u v, PMEmpty n id) => PMonoid n id t u v instance (PSemigroup n t u v, PMEmpty n id) => PMonoid n id t u v