Return True

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);

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