Ответ 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.