我正在从许多不同的地方收集代码,我正在尝试处理以下问题:
问题
我有一个具有以下简化类型的变压器堆栈:
action :: m (ReaderT r IO) a
我正在尝试在具有不同阅读器环境的不同堆栈的上下文中使用该操作:
desired :: m (ReaderT r' IO) a
我当然可以提供
f :: r' -> r
例子
things :: m (ReaderT r' IO) ()
things = do
-- ... some stuff
-- <want to use action here>
action :: m (ReaderT r IO) a -- broken
-- ... more stuff
pure ()
我考虑过的
withReaderT :: (r' -> r) -> ReaderT r m a -> ReaderT r' m a
这有一个问题,ReaderT 是外部单子,而我想在内部单子上使用它。
我也认为这可能与 MonadBase 或 MonadTransControl 有关,但我不熟悉它们的工作原理。