Haskell(嵌套)ReaderT

for*_*ste 3 monads haskell

你怎么能访问ReaderT的内部monad.

在我的情况下,我有典型的:

newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSConf) IDEM a)
    deriving (Monad, MonadIO, MonadReader (Maybe VCSConf))
Run Code Online (Sandbox Code Playgroud)

我可以在这个Monad中运行的函数中访问(可能是VCSConf)

commitAction' :: Common.VCSAction ()
commitAction' = do
   config <- ask
   ...
Run Code Online (Sandbox Code Playgroud)

但我也应该能够访问内部IDEM,结果是类型:

type IDEM = ReaderT IDERef IO
Run Code Online (Sandbox Code Playgroud)

所以我希望能够做类似的事情

commitAction' :: Common.VCSAction ()
commitAction' = do
   config <- ask
   ideRef <- lift $ ask -- this does not compile/work
Run Code Online (Sandbox Code Playgroud)

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

ham*_*mar 5

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

ideRef <- VCSSetupAction $ lift $ ask
Run Code Online (Sandbox Code Playgroud)

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