我正在编写一个程序,该程序涉及RWS
跟踪可变状态并生成一些日志。我的目的是定义一个计算来评估一些动作,收集随后的状态,并根据它在日志的开头附加一些东西。Writer
最小的例子:
type M = RWS () String [Int]
run a = evalRWS a () []
prepend s = tell (foldMap show s)
act = do
tell "a"
modify (1:)
tell "b"
comp = mfix $ \s -> prepend s >> act >> get
在这里,我通过在事件发生MonadFix
之前写入日志来改变过去。act
它完美地返回"1ab"
。但是,如果我使用M
来遍历状态,那么它会挂起:
prepend s = forM_ s (tell . show)
这种行为对我来说很奇怪,我不明白为什么这个计算会发散。更难证明其合理性,因为prepend
第二个变体中的状态不会在任何程度上改变状态。为什么这个程序不收敛?我可以做些什么来修复(inb4“hehe fix”)吗?
我知道我可以使用State
part of解决它RWS
,但出于某种原因,我想避免它。