如何访问ReaderT的内部monad。
在我的情况下,我有典型的:
newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSConf) IDEM a)
deriving (Monad, MonadIO, MonadReader (Maybe VCSConf))
我可以在这个Monad中运行的函数中访问(可能是VCSConf),如
commitAction' :: Common.VCSAction ()
commitAction' = do
config <- ask
...
但我也应该能够访问内部IDEM,结果是类型:
type IDEM = ReaderT IDERef IO
所以我希望能够做一些像
这样的事情commitAction' :: Common.VCSAction ()
commitAction' = do
config <- ask
ideRef <- lift $ ask -- this does not compile/work
我仍然不太了解莫纳德。谢谢你的帮助。
答案 0 :(得分:5)
要直接使用lift
,您的newtype
必须派生MonadTrans
,但由于它不是变压器,因此在这种情况下这不合适。相反,您可以将操作包装在数据构造函数中。现在,您正在直接处理ReaderT
,因此您可以使用其lift
。
ideRef <- VCSSetupAction $ lift $ ask
您可能希望为此定义一个帮助程序以使事情更清晰。