最も慣用的なのはfoldLeft-- です。折り畳みは、関数型プログラミングでは非常に自然に行われます。別の可能性はscanLeft、簿記をわずかに減少させる可能性がある です。
一方、これが実際にどのように見えるかは、Stateモナドの反復です。『 Functional Programming in Scala』という本には、演習の 1 つとして、これによく似た内容があります。
Stateモナドは基本的に の関数のモナド オーバー タイプですAがS => (S, A)、通常は一般的な操作を容易にするいくつかの特殊なメソッドを備えた適切なタイプとして宣言されます。
あなたの例では、状態は最後の結果のSになりますOption[A](または、適切な場合は の「ゼロ」A)。次に、コレクションをその型Tから関数S => (S, A)(または状態モナド型) にマップし、Coll[S => (S, A)].
そこから、 を取得し、初期状態をフィードしてから、を取得することができsequenceます (これはモナドの場合に変わりsequenceます-- The Essence of the Iterator Pattern を参照してください) 。M[N[A]]N[M[A]]MNS => (S, Coll[A])Coll[A]
Web 上には状態モナドに関するリソースがたくさんありますが、個人的には他のほとんどのモナドよりも扱いが難しいと感じました。「状態」モナドの名前が間違っている可能性があると誰かが私に言いましたが、それは実際には「状態プロセッサ」モナドであり、私には理にかなっています。
とにかく、あなたの選択肢からfoldLeftは最も慣用的ですが、状態モナドアプローチはこのタスクに非常に適しています。