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