Ответ вслух Middle Функции высшего порядка обновлено

Каррирование и частичное применение

Вопрос

Объясните, что такое каррирование и частичное применение. Как бы вы написали универсальный curry и где это полезно?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Каррирование превращает функцию нескольких аргументов в цепочку вызовов: add(1, 2, 3) можно вызвать как add(1)(2)(3) или add(1, 2)(3). Частичное применение проще: я заранее фиксирую часть аргументов и получаю функцию от остальных, например const log = logger.bind(null, 'api').

Что должно прозвучать в ответе

  • Каррирование: `f(a, b, c)` вызывается как `f(a)(b)(c)` или группами

  • Частичное применение: фиксируем часть аргументов, получаем функцию от остальных (`bind`, обёртка)

  • `curry` копит аргументы и вызывает исходную, когда их не меньше `fn.length`

  • Ограничение: `fn.length` не учитывает дефолты и rest

  • Польза: настройка функций заранее, композиция, точечный стиль

  • Цена: хуже читаемость и отладка, если злоупотреблять

Что могут спросить следом

  • Как сделать curry для функции с переменным числом аргументов, например sum(1)(2)(3)()?
  • Сохранит ли ваш curry this?
  • Чем частичное применение через 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 ошибок.