Основная идея состоит в том, что все три являются способами применения некоторой функции ко всем элементам списка.
Карта, пожалуй, самая простая - вы просто применяете функцию к каждому элементу списка.По сути, это то же самое, что и цикл 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
.
Сгибание особенное, потому чтов отличие от двух других, он обычно возвращает скалярное значение - то, что было элементом списка, а не самого списка.(Это не всегда так, но все равно думайте об этом сейчас.)
Обратите внимание, что я, возможно, не довел до совершенства каждую деталь кода - я когда-либо использовал только другой, более старыйреализации Схемы, поэтому я мог пропустить некоторые детали Ракетки.