{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreid2nlmxapw34vfjozzf7oqdfx3zxcbdj5amh7apmqeetxvtyliyge",
    "uri": "at://did:plc:pi6woz4d47bkuws673w2il2r/app.bsky.feed.post/3mmzqjzvus3l2"
  },
  "path": "/t/changing-reader-environment-type-in-an-effect-system/12804#post_18",
  "publishedAt": "2026-05-29T22:25:00.000Z",
  "site": "https://discourse.haskell.org",
  "textContent": "I got the idea for something like this but I don’t know how practical it is\n\n\n    class (MonadReader r m, forall r' . MonadReader r' (ChangeReader m r')) => SmartMonadReader r m where\n      data family ChangeReader m r' :: Type -> Type\n      changeReader :: (r' -> r) -> m a -> ChangeReader m r' a\n\n\n    instance Monad m => SmartMonadReader r (ReaderT r m) where\n      newtype instance ChangeReader (ReaderT r m) r' a = ChangeReaderReaderT (ReaderT r' m a)\n        deriving newtype (Functor, Applicative, Monad, MonadReader r')\n      changeReader f x = ChangeReaderReaderT (withReaderT f x)\n\n\n    instance (SmartMonadReader r m) => SmartMonadReader r (MaybeT m) where\n      newtype instance ChangeReader (MaybeT m) r' a = ChangeReaderMaybeT (MaybeT (ChangeReader m r') a)\n      changeReader f x = ChangeReaderMaybeT (mapMaybeT (changeReader f) x)\n\n    deriving newtype instance (SmartMonadReader r m) => Functor (ChangeReader (MaybeT m) r')\n    deriving newtype instance (SmartMonadReader r m) => Applicative (ChangeReader (MaybeT m) r')\n    deriving newtype instance (SmartMonadReader r m) => Monad (ChangeReader (MaybeT m) r')\n    deriving newtype instance (SmartMonadReader r m) => MonadReader r' (ChangeReader (MaybeT m) r')\n\n\n    instance (Monoid w, SmartMonadReader r m) => SmartMonadReader r (WriterT w m) where\n      newtype instance ChangeReader (WriterT w m) r' a = ChangeReaderWriterT (WriterT w (ChangeReader m r') a)\n      changeReader f x = ChangeReaderWriterT (mapWriterT (changeReader f) x)\n\n    deriving newtype instance (Monoid w, SmartMonadReader r m) => Functor (ChangeReader (WriterT w m) r')\n    deriving newtype instance (Monoid w, SmartMonadReader r m) => Applicative (ChangeReader (WriterT w m) r')\n    deriving newtype instance (Monoid w, SmartMonadReader r m) => Monad (ChangeReader (WriterT w m) r')\n    deriving newtype instance (Monoid w, SmartMonadReader r m) => MonadReader r' (ChangeReader (WriterT w m) r')\n",
  "title": "Changing Reader environment type (in an effect system?)"
}