如何使用遍历TypeClass基于元素累积状态,然后映射状态和元素?

时间:2012-04-23 21:45:57

标签: scala functional-programming iterator

我应该传递给'遍历'的函数(从迭代器模式的本质)是什么,这样我就可以根据每个原始元素累积状态,然后根据原始元素和状态到目前为止进行映射

在'collect'和'disperse'中,映射取决于状态或状态取决于元素,但不能同时取决于两者。

http://etorreborre.blogspot.co.uk/2011/06/essence-of-iterator-pattern.html处的表似乎表示我应该使用'traverse'但是traverse是实现所有其他功能的函数,所以我有点迷失。

2 个答案:

答案 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)