gpt4 book ai didi

haskell - 是否有一个 Monad 收集结果和 `mappend` s 它们?

转载 作者:行者123 更新时间:2023-12-04 00:16:30 26 4
gpt4 key购买 nike

我有以下带有半群元素的阅读器模式:

runFunction :: Reader Env Element
runFunction = do
a <- getA
b <- getB
c <- getC
return $ a <> b <> c

在哪里 getA :: Reader Env Element .

有没有办法:

runFunction = do
getA
getB
getC

我觉得我经常看到这种模式,我强制链接单子(monad)调用,最后它们变成一个元素。

注意:我不想做 getA >>= getB >>= getC自从 getB不是 :: Element -> Reader Env Element

感觉就像一个 State Monad,它会自动修改状态为 <> ,但我不知道。

使用一元代码对我来说仍然很新鲜。

最佳答案

WriterT monad 转换器可用于为每个 Action 建立一个幺半群值。

您可以使用 lift将您的 Reader 操作包装到 WriterT monad 转换器中,然后使用 tell 将每个操作的结果移动到 monad 的环境中,对操作进行排序,然后使用 execWriterT 将结果解包回单个 Reader 操作.

我的意思是:

import Control.Monad.Writer

wrap :: (Monad m, Monoid w) => m w -> WriterT w m ()
wrap m = lift m >>= tell

unwrap :: (Monad m) => WriterT w m a -> m w
unwrap = execWriterT

runFunction :: Reader Env Element
runFunction = unwrap $ do
wrap getA
wrap getB
wrap getC

如您所见,这可以推广到任何 monad,而不仅仅是 Reader

关于haskell - 是否有一个 Monad 收集结果和 `mappend` s 它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63493297/

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