Карта, Фильтр, Foldr в DrRacket / Схема - PullRequest
13 голосов
/ 24 октября 2011

Язык программирования: Scheme / DrRacket

В настоящее время мы изучаем map, filter и foldr в моем классе по компьютерным наукам.Я понимаю, что все три могут использоваться для создания абстрактных функций, но я, честно говоря, немного озадачен разницей между тремя и тем, когда я буду использовать каждую из них.

Кто-нибудь хочет объяснить, для чего используется каждый и чем он отличается?К сожалению, моя книга не очень ясна.

Ответы [ 2 ]

39 голосов
/ 24 октября 2011

Основная идея состоит в том, что все три являются способами применения некоторой функции ко всем элементам списка.

Карта, пожалуй, самая простая - вы просто применяете функцию к каждому элементу списка.По сути, это то же самое, что и цикл 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 голосов
/ 25 октября 2011

Я могу порекомендовать следующие упражнения для пальцев (и текст, который будет представлен ранее):

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

...