import Control.Monad.Reader.Class (MonadReader) import Control.Monad.IO.Class (MonadIO) 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 @??????? (pure 1) test2 :: MonadReader Char m => m Bool test2 = example @(MonadReader Char) (pure False) main = pure ()