Каррирование и частичное применение
Вопрос
Объясните, что такое каррирование и частичное применение. Как бы вы написали универсальный curry и где это полезно?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Каррирование: `f(a, b, c)` вызывается как `f(a)(b)(c)` или группами
Частичное применение: фиксируем часть аргументов, получаем функцию от остальных (`bind`, обёртка)
`curry` копит аргументы и вызывает исходную, когда их не меньше `fn.length`
Ограничение: `fn.length` не учитывает дефолты и rest
Польза: настройка функций заранее, композиция, точечный стиль
Цена: хуже читаемость и отладка, если злоупотреблять
Что могут спросить следом
- Как сделать
curryдля функции с переменным числом аргументов, напримерsum(1)(2)(3)()? - Сохранит ли ваш
currythis? - Чем частичное применение через
bindотличается от стрелки-обёртки?
Разбор
Образцовый ответ: «Каррирование превращает функцию нескольких аргументов в цепочку вызовов: add(1, 2, 3) можно вызвать как add(1)(2)(3) или add(1, 2)(3). Частичное применение проще: я заранее фиксирую часть аргументов и получаю функцию от остальных, например const log = logger.bind(null, 'api'). Универсальный curry пишется через замыкание: возвращаю функцию curried(...args), если аргументов уже не меньше fn.length, вызываю fn.apply(this, args), иначе возвращаю функцию, которая допишет новые аргументы и снова вызовет curried. Ограничение: length не считает параметры с дефолтами и rest, для них нужна явная арность. Полезно, когда функцию удобно настроить заранее и потом передать в map или собрать конвейер через pipe. Но злоупотреблять не стоит: цепочки вызовов хуже читаются в стектрейсах и ревью».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
reduce без начального значения и тип аккумулятора
Следующий вопрос
Функции высшего порядка на практике