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