3

元の要素のそれぞれに基づいて状態を累積し、元の要素とこれまでの状態に基づいてマップできるように、(イテレータパターンの本質から)「トラバース」に渡す必要がある関数は何ですか。

「収集」および「分散」では、マッピングが状態に依存するか、状態が要素に依存するかのいずれかのみが発生しますが、両方が同時に発生することはありません。

http://etorreborre.blogspot.co.uk/2011/06/essence-of-iterator-pattern.htmlの表には、「トラバース」を使用する必要があると書かれているようですが、トラバースは他のすべてを実装する関数なので、私は少し迷っています。

4

2 に答える 2

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))
于 2012-04-23T23:35:13.367 に答える
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)

于 2012-04-24T09:30:52.557 に答える