【发布时间】:2020-12-09 02:17:03
【问题描述】:
我有以下带有半群元素的阅读器模式:
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
我觉得我经常看到这种模式,我强制链接单子调用,最后它们变成一个元素。
注意:我不想做getA >>= getB >>= getC,因为getB 不是:: Element -> Reader Env Element
感觉就像一个 State Monad,自动修改状态为 <>,但我不知道。
使用一元代码对我来说仍然很新鲜。
【问题讨论】:
-
do块等同于getA >> getB >> getC。你可以使用foldr1 (<>) <$> sequenceA [getA, getB, getC]。 -
也许你需要
Writermonad 的一些变体,它在隐式写入的值上使用<>。一个主要问题是:您希望何时访问连接的Elements 的结果?在单子计算的最后?使用Writer。在中间?您可能需要State的一些变体。
标签: haskell functional-programming monads state-monad monoids