Haskell(嵌套)ReaderT

时间:2011-11-27 20:54:45

标签: haskell monads

如何访问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

我仍然不太了解莫纳德。谢谢你的帮助。

1 个答案:

答案 0 :(得分:5)

要直接使用lift,您的newtype必须派生MonadTrans,但由于它不是变压器,因此在这种情况下这不合适。相反,您可以将操作包装在数据构造函数中。现在,您正在直接处理ReaderT,因此您可以使用其lift

ideRef <- VCSSetupAction $ lift $ ask

您可能希望为此定义一个帮助程序以使事情更清晰。