{-# language UndecidableSuperClasses #-} import Control.Monad.Reader.Class (MonadReader) import Control.Monad.IO.Class (MonadIO) class (c1 m, c2 m) => Combine c1 c2 m instance (c1 m, c2 m) => Combine c1 c2 m example :: c m => (forall m. c m => m a) -> m a example a = a test1 :: (MonadReader () m, MonadReader Double m, MonadIO m) => m Int test1 = example @(Combine (MonadReader ()) (Combine (MonadReader Double) MonadIO)) (pure 1) test2 :: MonadReader Char m => m Bool test2 = example @(MonadReader Char) (pure False) main = pure ()