2011-11-27 59 views
3

如何访问ReaderT的内部单元。Haskell(嵌套)ReaderT

在我来说,我有典型值:

newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSConf) IDEM a) 
    deriving (Monad, MonadIO, MonadReader (Maybe VCSConf)) 

我卡恩访问(也许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 

我还是不明白Monads对此足够好。谢谢你的帮助。

回答

4

要直接使用lift,您的newtype必须派生MonadTrans,但由于它不是变压器,因此这种情况不适用。相反,你可以将这个动作包装在你的数据构造函数中。现在您直接与ReaderT打交道,因此您可以使用它的lift

ideRef <- VCSSetupAction $ lift $ ask 

你可能想要定义一个帮助器来使事情变得更清洁。

+0

哇,效果很好! – forste