2012-04-23 1 views
3

元の要素のそれぞれに基づいて状態を累積し、それまでの元の要素と状態に基づいてマップできるように、(反復子パターンの本質から)「トラバース」に渡すべき関数とは何ですか?トラバースTypeClassを使用して要素に基づいて状態を累積し、状態と要素をマップする方法

'collect'と 'disperse'では、マッピングは状態に依存しますが、状態は要素に依存しますが、同時に両方ではありません。

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

+1

ハスケルとは何が関係していますか?私はそのタグを削除する必要がありますと思います。 –

+0

例を挙げてください。 –

+0

mapAccumL/mapAccumRのようなサウンドです。ハスケル版についてはhttp://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Traversable.html#v:mapAccumLをご覧ください。 –

答えて

5

あなたがStateを返す関数でtraverseメソッドを使用する場合、あなたは正確に何をしたい取得:私がやりたいことの

// 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)) 
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)

関連する問題