Что такое каррирование
Что проверяют
Отличаете ли вы каррирование от частичного применения и понимаете ли, зачем оно нужно.
Как отвечать
Каррирование это преобразование функции от нескольких аргументов в цепочку функций, каждая из которых принимает по одному аргументу.
const add = (a) => (b) => (c) => a + b + c;
add(1)(2)(3); // 6Каждый вызов возвращает новую функцию, помнящую переданные значения через замыкание, и только последний даёт результат.
Отличие от частичного применения, которое с ним постоянно путают: частичное применение фиксирует часть аргументов и возвращает функцию, принимающую все оставшиеся сразу. Каррирование строго по одному. На практике в JavaScript чаще нужно именно частичное применение, а универсальные функции из библиотек обычно совмещают оба поведения, позволяя передавать аргументы и по одному, и группами.
Зачем это нужно:
- специализация: из общей функции получается частная. Функция журналирования с уровнем превращается в функцию записи предупреждений, и уровень больше не надо указывать;
- композиция: функции одного аргумента складываются в конвейер. Это основа функционального стиля, где данные проходят через цепочку преобразований;
- удобство в колбэках: готовая специализированная функция передаётся напрямую, без обёртки в стрелочную функцию.
Что стоит сказать про практику: в обычном коде на JavaScript каррирование ради каррирования встречается редко и делает код менее читаемым. Обычно достаточно замыкания или привязки аргументов. Осмысленно оно там, где принят функциональный стиль с композицией.
Тонкость реализации универсальной версии: функция должна знать, сколько аргументов ожидалось. Для этого используется длина исходной функции, но она не считает параметры со значениями по умолчанию и остаточные, поэтому такие функции каррируются неправильно.
Где спотыкаются
Называют каррированием любое частичное применение.
Применяют его там, где хватило бы обычного замыкания.
Не учитывают, что длина функции не считает параметры по умолчанию.
Не могут объяснить, зачем нужны функции одного аргумента.