gpt4 book ai didi

Haskell ReaderT Env IO 样板

转载 作者:行者123 更新时间:2023-12-02 20:37:34 28 4
gpt4 key购买 nike

我经常使用以下样板,并希望将其消除。它看起来像这样:

type Configured = ReaderT Config

doSomething :: Configured IO Data
doSomething = do
getMeta <- asks getMetaData
meta <- liftIO getMeta

我想将其简化为这样:

doSomething = do
meta <- find getMetaData

不幸的是,我还没有完全理解 monad 转换器。 find 的类型是什么?是(Config -> IO Result) -> Result吗?怎么写呢?

非常感谢任何帮助我理解 monad 转换器的提示/解释。

谢谢!

最佳答案

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

doSomething = do
getMeta <- asks getMetaData
meta <- liftIO getMeta
...

使用the third monad law ,我们可以将想要提取的部分移动到它自己的 do-block 中:

doSomething = do
meta <- do getMeta <- asks getMetaData
liftIO getMeta
...

接下来,我们可以提取该子表达式并为其命名:

findMetaData = do getMeta <- asks getMetaData
liftIO getMeta

doSomething = do
meta <- findMetaData
...

最后,让我们通过用参数替换对 getMetaData 的显式引用来概括它:

find something = do x <- asks something
liftIO x

doSomething = do
meta <- find getMetaData
...

现在,我们可以将其加载到 GHCi 中并要求它为我们推断类型:

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

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

find something = ask >>= liftIO . something

为此,我使用了 the definition of asksthe desugaring rules for do-notation .

关于Haskell ReaderT Env IO 样板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8159330/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com