2011-11-27 93 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