我应该传递给'遍历'的函数(从迭代器模式的本质)是什么,这样我就可以根据每个原始元素累积状态,然后根据原始元素和状态到目前为止进行映射
在'collect'和'disperse'中,映射取决于状态或状态取决于元素,但不能同时取决于两者。
http://etorreborre.blogspot.co.uk/2011/06/essence-of-iterator-pattern.html处的表似乎表示我应该使用'traverse'但是traverse是实现所有其他功能的函数,所以我有点迷失。
答案 0 :(得分:5)
当您使用traverse
方法和返回State
的函数时,您可以得到您想要的内容:
// a function using the current element and the previous state
def function[S, T](s: S, t: T): R = // combine T and S
// return a State instance to use as an Applicative with traverse
def myState[T, S](t: T) = State[S, R]((s: S) => function(s, t))
// a sequence to traverse
val sequence: Seq[T] = ...
// use the traverse method
sequence.traverse(t => myState(t))
答案 1 :(得分:0)
我想做的一个例子:
main = putStrLn $ show $ runState s 0
where
s = traverse f [1,2,3,4,5]
f = \x -> state( \y -> (x*20+y, y+x) )
结果为([20,41,63,86,110],15)