単一リンクリストを考えてみましょう。それは何かのように見えます
data List x = Node x (List x) | End
のような折りたたみ関数を定義するのは自然なことです。
reduce :: (x -> y -> y) -> y -> List x -> y
ある意味で、 everyを に、everyをにreduce f x0
置き換えます。これは、プレリュードがフォールドと呼んでいるものです。Node
f
End
x0
次に、単純な二分木を考えます。
data Tree x = Leaf x | Branch (Tree x) (Tree x)
のような関数を定義することも同様に自然です。
reduce :: (y -> y -> y) -> (x -> y) -> Tree x -> y
この削減にはまったく異なる特徴があることに注意してください。リストベースのものは本質的にシーケンシャルですが、この新しいツリーベースのものは、より分割統治の感覚があります。par
そこにいくつかのコンビネータを投げることさえ想像できます。(リストバージョンのどこにそんなものを入れますか?)
私の質問: この機能はまだ「折り畳み」として分類されていますか、それとも別のものですか? (もしそうなら、それは何ですか?)
基本的に、誰かが折り畳みについて話すときはいつでも、本質的にシーケンシャルな折り畳みリストについて話します。「シーケンシャル」が折り畳みの定義の一部なのか、それともこれが最も一般的に使用される折り畳みの例の単なる偶然の特性なのか、疑問に思っています。