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