Подтвердить что ты не робот

Карта, фильтр, Foldr в DrRacket/Scheme

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

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

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

4b9b3361

Ответ 1

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

Карта, пожалуй, самая простая - вы просто применяете эту функцию к каждому элементу списка. Это в основном то же самое, что и для каждого цикла на других языках:

 (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.

Fold является особенным, потому что, в отличие от двух других, он обычно возвращает скалярное значение - то, что было элементом списка, а не самим списком. (Это не всегда так, но в любом случае подумайте об этом так.)

Обратите внимание, что я, возможно, не получил каждую деталь кода совершенным - я использовал когда-либо другую, более старую реализацию Схемы, поэтому я мог пропустить некоторые детали Racket.