Задать вопрос
@YuriyBum334

Зачем нужно каррирование функций?

На собеседовании часто задают вопрос про каррирование - сделать вместо function (a, b, c) { /* ... */}
function (a)(b)(c) {/* ... */}.
В чем дело? Да в том, что в рабочем проекте я этого не встречал НИ РАЗУ. Я писал системы мониторинга, интернет портал, личный кабинет, криптобиржу, и таких вещей не встречал нигде.
Ощущение, что эту опцию придумали исключительно для собеседований. Есть ли рабочий проект, где используется подобное?
  • Вопрос задан
  • 194 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 7
otdameskapizm
@otdameskapizm
Помог ответ? Отметь решением...
Каррирование используется в библиотеках. Например, вот этой: https://github.com/substantial/updeep
Ответ написан
Комментировать
@AlexSku
не буду отвечать из-за модератора
На Haskell точно используется, т.к. частично применённые функции можно объединять (композиция, функторы, аппликативные функторы...), а как заметил mayton2019, тут и оптимизация возможна.
Посмотрите лекцию Дениса Москвина про оптимизацию.
Ответ написан
Комментировать
Griboks
@Griboks
В чем дело? Да в том, что в рабочем проекте я этого не встречал НИ РАЗУ.

Поддерживаю, никто не использует каррирование в чистом виде. С другой стороны, если учесть, что классы - это частный случай каррирования, то его используют повсеместно.

Ну а вопрос, зачем динамически выполнять то, что ещё на этапе проектирования зафиксировано и статично (я говорю о вызове функций), всегда вводит в ступор адептов каверзных вопросов и ФП.
Ответ написан
xez
@xez
TL Junior Roo
Зачем - можно почитать в интернетах.
Используется довольно часто, в библиотеках java используется очень часто.
Ответ написан
Комментировать
@Yagher
Для замыкания, например.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Насколько я понимаю, каррирование - это плод математических исследований. Математики не интересовались программированием а их больше интересовало некое механическое преобразование мат-функций с целью доказательства какого-то их свойства. Вот. Значит если есть сложная функция у которой сотня аргументов но ее с помощью преобразований удается свести к сотне функций с 1 аргументом - то это успех.

Где это практически применяется я щас не скажу. Но вот Haskell компиллятор видит все функции как каррированные. При этом на output функция будет вести себя как обычная.

Еще КМК каррированные функции очень удобно оптимизировать. Если мы можем часть аргументов зафиксировать (константы) - тогда остаточное туловище функции будет быстрым. Мы ведь уже выбросили
часть аргументов и компиллятор может доказать больше инвариантов. Для обычных императивных ЯП
кажется такое невозможно.
Ответ написан
Комментировать
Встречаю частенько каррирование в библиотеках и фреймворках для Scala. В прикладном программировании не использую и другим не рекомендую. Это скорее синтаксический сахар чтобы пользователю библиотеки было удобнее использовать API.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы