gpt4 book ai didi

haskell - 处理置换的单子(monad)变压器堆栈

转载 作者:行者123 更新时间:2023-12-03 20:05:39 24 4
gpt4 key购买 nike

我发现 monad 转换器的问题之一是需要 lift操作进入正确的单子(monad)。单lift这里和那里都不错,但有时有些功能看起来像这样:

fun = do
lift a
lift b
c
lift d
lift e
f

我希望能够编写这个函数:
fun = monadInvert $ do
a
b
lift c
d
e
lift f

这将 lift 的数量减半s 并使代码更干净。

问题是:monad 是什么 monadInvert可能的?应该如何创建这个功能?

加分:为 monad m 定义它这是 MonadIO 的一个实例.

这个问题的标题谈到了排列:确实,我们如何处理 monad 转换器堆栈的任意排列?

最佳答案

嗯,首先,你实际上并不需要这么多的提升。对于 monad 转换器,以下恒等式成立:

lift c >>= lift . f = lift (c >>= f)
lift c1 >> lift c2 = lift (c1 >> c2)

写法并不少见:
x <- lift $ do
{- ... -}

接下来是:当您使用 mtl 或 monadLib 之类的库时(即直接键入基于类的库而不是转换器),您实际上可以直接访问大多数底层 monad:
c :: StateT MyState (ReaderT MyConfig SomeOtherMonad) Result
c = do
x <- ask
y <- get
{- ... -}

最后,如果尽管有这两点,您确实需要大量提升,您应该考虑编写自定义 monad 甚至使用完全不同的抽象。我发现自己使用自动机箭头进行有状态计算而不是状态单子(monad)。

关于haskell - 处理置换的单子(monad)变压器堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8383587/

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