したがって、これにはおそらく のような折り畳みを使用する必要がありますfoldl。
一般に、使用するmapか折り畳むかを決定するとき (ここで折り畳みは、またはのいずれfoldlかを意味しますfoldr)、次の経験則を使用できます。
取得したいリストに取得したリストとまったく同じ数の要素がある場合は、おそらくmap. それ以外の場合は、折り目が必要になります。
理由は次のとおりです。リスト内の各要素に対してmap、変換された要素が出力に生成されます。一方、fold はより一般的で、やりたいことは何でもできます。(そして、実際にmap折り畳みを使用して実装することもできます。これは、もちろん、物事を不必要に複雑にする必要がないという意味ではありません)
完全を期すために、折り畳みがどのように機能するかについて簡単に説明しましょう。折り畳みはリスト (foldl左foldrから、右から、したがって名前) を実行し、アキュムレータで一度に 1 つの要素で結果を構築します。
例で見てみましょう:
foldl (fn (e, a) => e + a) 0 [5, 3, 7, 10]
e現在作業中の要素とaアキュムレータ変数 (つまり、現在の結果) は次のとおりです。を開始値としてa = 0指定0したため、 から開始します。
| e | a | new a
-------------------------
| 5 | 0 | 5 + 0 = 5
| 3 | 5 | 3 + 5 = 8
| 7 | 8 | 7 + 8 = 15
| 10 | 15 | 10 + 15 = 25
| | 25 |
これにより の最終値aが得25られ、関数がリスト内の要素を合計したことがわかります。どの反復でも、 の値がaこれまでのリスト内の要素の合計であることに注意してください。また、各ステップでこのリストを拡張して 1 つ以上の要素を含める方法に注目してください。
これは、この問題を解決するために私が推奨する一種のアプローチです。
- のベース値が
aどうあるべきかを検討してください。(入力として取得した結果と同じ[]です。)
- 次に、より小さなリストから結果を取得し、それを拡張して別の要素を含める方法を検討してください。