{
"$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?)"
}