{-# LANGUAGE KindSignatures #-} {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE DeriveAnyClass #-} import Data.Monoid import Data.Kind import Data.Functor.Identity data Logger = LFile | LStdout deriving Show data Database = DPG | DMem deriving Show data App (m :: Type -> Type) = App { _logger :: m Logger , _db :: m Database } deriving instance forall m a. Monoid (m a) => Monoid (App m)