{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# 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 :: n id -- | Parameterized version of Monoid. type PMonoid n id t u v = (PMEmpty n id, PSemigroup n t u v)