Map, filter, reduce — вот самые распространенные функции высшего порядка над списком. Высшего порядка они потому, что помимо списка принимают в качестве аргумента функцию. Рассмотрим, как они работают.

Map

Применяет некую функцию к каждому элементу списка.

Аргументы:

  1. функция от одного аргумента,
  2. список.

Результат: новый список с таким же количеством элементов, что и первоначальный.

Пример: возвести в квадрат каждое число из списка

map(square, [1, 2, 3]) // [1, 4, 9]

Filter

Отсеивает из списка элементы, которые не удовлетворяют некоторому условию. Условие выражено предикатом, который передается как аргумент в filter. Предикат — это функция, которая возвращает true или false в зависимости от переданных ей аргументов.

Аргументы:

  1. функция-предикат от одного аргумента,
  2. список.

Результат: новый список, содержащий некоторое количество элементов из первоначального списка.

Пример: выбросить из списка все нечетные числа

filter(isEven, [1, 2, 3]) // [2]

Reduce

Последовательно комбинирует вместе все элементы списка и некоторое исходное значение. Как именно комбинирует, задается переданной в reduce функцией. Исходное значение нужно потому что reduce пустого списка тоже должен что-то возвращать. Известен под альтернативным названием fold.

Аргументы:

  1. функция от двух аргументов,
  2. исходное значение,
  3. список.

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

Пример: сложить вместе все числа в списке

reduce(add, 0, [1, 2, 3]) // 6