最も慣用的なのは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]]
M
N
S => (S, Coll[A])
Coll[A]
Web 上には状態モナドに関するリソースがたくさんありますが、個人的には他のほとんどのモナドよりも扱いが難しいと感じました。「状態」モナドの名前が間違っている可能性があると誰かが私に言いましたが、それは実際には「状態プロセッサ」モナドであり、私には理にかなっています。
とにかく、あなたの選択肢からfoldLeft
は最も慣用的ですが、状態モナドアプローチはこのタスクに非常に適しています。