Подтвердить что ты не робот

Каковы практические преимущества каррирования?

Я вижу много документации и вопросов о том, что такое техника каррирования, но я нашел очень мало информации о том, почему ее можно было бы использовать на практике. Мой вопрос в том, каковы преимущества каррирования? Возможно, вы можете представить тривиальный пример, в котором каррирование было бы предпочтительнее обычного вызова метода.

Я работаю на С++, пока солнце поднимается, так что до настоящего времени у меня было мало воздействия на карри, кроме вне работы, использующей языки.

4b9b3361

Ответ 1

Во-первых, очень часто ошибочно принимать приложение частичной функции для каррирования. Например, посмотрите этот (я уверен, что есть лучшие ресурсы, описывающие его, но это был первый, который я нашел). Я почти никогда не видел, чтобы кто-то использовал currying на практике (за исключением таких языков, как Haskell, где каждая функция, как говорится, используется самим языком, но даже для того, чтобы включить приложение простой частичной функции). С другой стороны, приложение с частичной функцией весьма полезно на многих языках.

В любом случае, предполагая, что вы говорите о приложении с частичными функциями (с тех пор, о чем говорит большинство людей, когда они спрашивают о каррировании), концепция не так естественна в С++, как в (чисто) функциональном языке, например, Haskell.

Например, здесь мы определяем функцию sum, которая принимает массив чисел list и суммирует все числа вместе. Если вы не используете концепцию fold (или уменьшаете или вводите, как ее иногда называют), читайте this. В любом случае, это будет выглядеть так:

sum list = foldl (+) 0 list

Но подождите минуту. Мы могли бы сократить его, используя приложение с частичной функцией! Вместо того, чтобы давать аргумент, мы просто говорим, что sum - это функция, равная foldl, с добавлением + и 0.

sum = foldl (+) 0

Какой из них легче читать? Вероятно, вопрос предпочтительнее, но последний, на мой взгляд, более четко отражает связь между суммой и складкой. И, пожалуйста, учтите, что это очень простой пример. Я честно не знаю, как написать хороший пример на С++, так что вам придется извинить меня там. В любом случае, каково практическое преимущество? Читаемость. Более четкое намерение. Более короткий код.

Отказ от ответственности: Если вы действительно хотели узнать преимущества каррирования (в отличие от приложения с частичной функцией), я сожалею, что заставил вас прочитать все это. Но, с другой стороны, если вы понимаете, что разница между ними также будет понимать, что каррирование - отличный способ реализовать приложение частичной функции.