01. ID
function id(x) {
return x;
}
Простая задача, которая нужна только для того, чтобы мы поняли суть.
Очевидное решение:
id(true)
И сразу на ум приходит решение покороче:
id(!0)
2 символа.
Интересный факт. Название id тут использовано не просто так. В математике есть такое понятие как identity function (по-русски — тождественное отображение). Это функция, которая возвращает свой аргумент, никак его не изменяя.
Может быть не сразу понятно, зачем оно нужно. Однако, когда мы имеем дело с числами, нам полезны «особые значения» вроде 0 или 1. Когда имеем дело со списками, полезны пустые списки. А когда имеем дело с функциями — полезна функция id
.
Предположим, что нужно пройтись по массиву чисел, и каждое нечётное число увеличить на единицу, а чётные оставить как есть. Вот как это решение выглядело бы в Джаваскрипте, в относительно реальных условиях:
arr.map(x => x % 2 ? x + 1 : x)
Однако, несмотря на то, что тут есть map
, код «недостаточно функционален». При функциональном подходе оперируют по большей мере функциями, а не напрямую данными.
И потому, если бы речь шла о функциональном программировании, код бы выглядел примерно так:
map(arr, when(isOdd, inc, id))
Здесь типичный для функционального программирования подход: один раз кладём данные в функцию, а дальше оперируем композицией других функций, выстраивая этакий пайплайн из них.
Реализация функций при этом была бы примерно такой:
const isOdd = x => x % 2 === 1;
const inc = x => x + 1;
const id = x => x;
const when = (cond, thenFn, elseFn) => x => cond(x) ? thenFn(x) : elseFn(x);
const map = (xs, fn) => xs.map(fn);
И вот тут уже видно, зачем может понадобиться функция, которая возвращает переданное ей значение. В контексте Джаваскрипта и веб-разработки это всё может выглядеть дико, но есть области, в которых это нормально. Та же математика.