反向状态monad是Haskell语言表达能力和惰性求值的非常棒而令人震撼的例子。但是理解这个monad并不容易。此外,很难找到一些令人信服的现实生活示例,说明你可以使用反向状态monad比语言中的任何其他工具更容易地完成某些任务。
反向状态 monad的定义如下:
newtype RState s a = RState { runRState :: s -> (a,s) }
instance Monad (RState s) where
return x = RState $ (,) x
RState sf >>= f = RState $ \s ->
let (a, past) = sf future
(b, future) = runRState (f a) s
in (b, past)
已经有一些例子和用法了,但我觉得它们都不太实用。
- Quora回答:解释得很好,甚至有使用的现实生活例子,但没有代码,并且不清楚使用
RState
是否是一个真正好的想法。 - Mindfuck: 介绍了这个好的概念,但示例不是很有用。没有人会以这种方式编写斐波那契数。
- Kwang的Haskell博客:展示了如何使用
RState
来模拟Writer
,但这不是一个真实的生活例子 :)
我也知道tardis
包tardis,但这个库没有教程,文档示例非常抽象,没有多少人真正理解它。最接近我想要的是这个教程,但它有tardis
的示例,而不仅仅是RState
。还有这本书的参考资料。
因此,我不是在寻找tardis
的现实模式,我只对RState
的说明感兴趣(如果可能的话)。虽然我明白可能没有纯粹使用RState
的示例。在这种情况下,带有RStateT
转换器或tardis
的最小示例已经足够了。
是否有人在生活中使用过这个单子,或者有非常好的有用代码示例?
Data.Traversable.mapAccumR
。 - dfeuer