プログラミング言語: Scheme/DrRacket
私たちは現在、コンプ科学クラスでmap
、filter
、およびに取り組んでいます。foldr
3つすべてを使用して抽象関数を作成できることは理解していますが、正直なところ、3つの違いと、それぞれをいつ使用するかについて少し混乱しています。
それぞれが何に使用され、どのように異なるのかを説明したい人はいますか? 残念ながら、私の本はあまり明確ではありません。
プログラミング言語: Scheme/DrRacket
私たちは現在、コンプ科学クラスでmap
、filter
、およびに取り組んでいます。foldr
3つすべてを使用して抽象関数を作成できることは理解していますが、正直なところ、3つの違いと、それぞれをいつ使用するかについて少し混乱しています。
それぞれが何に使用され、どのように異なるのかを説明したい人はいますか? 残念ながら、私の本はあまり明確ではありません。
基本的な考え方は、3つすべてが、リストのすべての要素に何らかの関数を適用する方法であるということです。
マップはおそらく最も単純です。リストの各要素に関数を適用するだけです。これは基本的に、他の言語のfor-eachループと同じです。
(map (lambda (x) (+ x 1)) '(1 2 3))
=> (2 3 4)
基本的に、マップは次のようになります。(map f '(1 2 3))
はと同じ(list (f 1) (f 2) (f 3))
です。
フィルタも単純です。関数はアービターのように機能し、各数値を保持するかどうかを決定します。メニューを見て、食べないものについて泣き言を言う、本当にうるさい食べる人を想像してみてください;)
(filter (lambda (x) (equal? x 1)) '(1 2 3))
=> (1)
折り目が一番わかりにくいと思います。より直感的な名前は「accumulate」です。アイデアは、あなたが進むにつれてリストを「結合」しているということです。日常的に使用されている関数の中には、実際には折りたたまれているものがいくつかあります。合計は完璧な例です。
(foldr + 0 '(1 2 3))
=> 6
foldは、関数を取得し、リスト内の各要素の間に配置することと考えることができます。はと(foldr + 0 '(1 2 3))
同じ1 + 2 + 3 + 0
です。
Foldは、他の2つとは異なり、通常はスカラー値(リスト自体ではなく、リストの要素であるもの)を返すため、特別です。(これは常に正しいとは限りませんが、とにかく今のところこのように考えてください。)
コードのすべての詳細を完全に把握できていない可能性があることに注意してください。Schemeの別の古い実装しか使用したことがないため、Racketの詳細を見逃している可能性があります。
これらの指のエクササイズ(およびその前のテキスト)をお勧めします。
http://htdp.org/2003-09-26/Book/curriculum-ZH-27.html#node_idx_1464