Ответ 1
Во-первых, очень часто ошибочно принимать приложение частичной функции для каррирования. Например, посмотрите этот (я уверен, что есть лучшие ресурсы, описывающие его, но это был первый, который я нашел). Я почти никогда не видел, чтобы кто-то использовал currying на практике (за исключением таких языков, как Haskell, где каждая функция, как говорится, используется самим языком, но даже для того, чтобы включить приложение простой частичной функции). С другой стороны, приложение с частичной функцией весьма полезно на многих языках.
В любом случае, предполагая, что вы говорите о приложении с частичными функциями (с тех пор, о чем говорит большинство людей, когда они спрашивают о каррировании), концепция не так естественна в С++, как в (чисто) функциональном языке, например, Haskell.
Например, здесь мы определяем функцию sum
, которая принимает массив чисел list
и суммирует все числа вместе. Если вы не используете концепцию fold (или уменьшаете или вводите, как ее иногда называют), читайте this. В любом случае, это будет выглядеть так:
sum list = foldl (+) 0 list
Но подождите минуту. Мы могли бы сократить его, используя приложение с частичной функцией! Вместо того, чтобы давать аргумент, мы просто говорим, что sum
- это функция, равная foldl, с добавлением + и 0.
sum = foldl (+) 0
Какой из них легче читать? Вероятно, вопрос предпочтительнее, но последний, на мой взгляд, более четко отражает связь между суммой и складкой. И, пожалуйста, учтите, что это очень простой пример. Я честно не знаю, как написать хороший пример на С++, так что вам придется извинить меня там. В любом случае, каково практическое преимущество? Читаемость. Более четкое намерение. Более короткий код.
Отказ от ответственности: Если вы действительно хотели узнать преимущества каррирования (в отличие от приложения с частичной функцией), я сожалею, что заставил вас прочитать все это. Но, с другой стороны, если вы понимаете, что разница между ними также будет понимать, что каррирование - отличный способ реализовать приложение частичной функции.