你怎么能访问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)
我仍然不太了解莫纳德.谢谢你的帮助.
要lift直接使用,你newtype必须得到MonadTrans,但由于它不是变压器,在这种情况下这是不合适的.相反,您可以将操作包装在数据构造函数中.现在你正在直接处理ReaderT,所以你可以使用它lift.
ideRef <- VCSSetupAction $ lift $ ask
Run Code Online (Sandbox Code Playgroud)
您可能希望为此定义一个帮助程序以使事情更清晰.