Haskell ReaderT环境样板

Haskell ReaderT环境样板,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,我有下面的样板文件,我经常做,并希望消除。它看起来像这样: type Configured = ReaderT Config doSomething :: Configured IO Data doSomething = do getMeta <- asks getMetaData meta <- liftIO getMeta doSomething = do meta <- find getMetaData type Configured=Reade

我有下面的样板文件,我经常做,并希望消除。它看起来像这样:

type Configured = ReaderT Config

doSomething :: Configured IO Data
doSomething = do
   getMeta <- asks getMetaData
   meta <- liftIO getMeta
doSomething = do
    meta <- find getMetaData
type Configured=ReaderT Config
doSomething::配置的IO数据
doSomething=do
getMeta IO结果)->结果
?我该怎么写呢

非常感谢任何能帮助我了解grok monad transformers的提示/解释


谢谢

这可以用相当机械的方式来完成。让我们从原始代码开始:

doSomething = do
    getMeta <- asks getMetaData
    meta <- liftIO getMeta
    ...
现在,我们可以将其加载到GHCi中,并要求它为我们推断类型:

*Main> :t find 
find :: (MonadReader r m, MonadIO m) => (r -> IO b) -> m b

或者,我们可能希望稍微清理一下并删除虚拟名称
x

find something = ask >>= liftIO . something

为此,我使用了and.

我现在没有时间解释这一点,但这里有一点:在您的示例中,
find
的类型是
(Config->IO Result)->Configured IO Result
,更一般地说,
Monad m=>(r->ma)->ReaderT r m a
。您可以将其定义为
find=asks>=>lift
。再进一步(如Miikka所述)就可以得到“find=asks>=>liftIO”。谢谢现在有道理了。
find something = do x <- asks something
                    liftIO x

doSomething = do
     meta <- find getMetaData
     ...
*Main> :t find 
find :: (MonadReader r m, MonadIO m) => (r -> IO b) -> m b
find something = ask >>= liftIO . something