web-dev-qa-db-ja.com

DrRacket / Schemeでのマップ、フィルター、Foldr

プログラミング言語:Scheme/DrRacket

現在、comp sciクラスのmapfilter、およびfoldrについて説明しています。 3つすべてを使用して抽象関数を作成できることを理解していますが、3つとそれぞれをいつ使用するかの違いについて正直に少し混乱しています。

誰もがそれぞれが何のために使用され、どのように違うのかを説明するのを気にしますか?残念ながら、私の本はあまり明確ではありません。

13
Lukas Pleva

基本的な考え方は、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)

折りは理解が一番難しいと思います。より直感的な名前は「蓄積」です。アイデアは、進むにつれてリストを「組み合わせる」ということです。実際にフォールドであるいくつかの関数が日常的に使用されています-合計は完璧な例です。

 (foldr + 0 '(1 2 3)) 
   => 6

折りたたみは、関数を取得し、リストの各要素の間に置くと考えることができます。(foldr + 0 '(1 2 3))1 + 2 + 3 + 0と同じです。

他の2つとは異なり、通常はスカラー値(リスト自体ではなくリストの要素であったもの)を返すため、Foldは特別です。 (これは常に正しいとは限りませんが、とりあえずこのように考えてください。)

コードのすべての詳細を完全に把握しているわけではないことに注意してください。私は、Schemeの別の古い実装を使用したことがあるので、ラケットの詳細を見逃している可能性があります。

39
Tikhon Jelvis

私はこれらの指のエクササイズ(および前に来るテキスト)をお勧めします:

http://htdp.org/2003-09-26/Book/curriculum-Z-H-27.html#node_idx_1464

2
soegaard