Каковы практические преимущества карри? - PullRequest
19 голосов
/ 14 марта 2011

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

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

1 Ответ

13 голосов
/ 14 марта 2011

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

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

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

sum list = foldl (+) 0 list

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

sum = foldl (+) 0

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

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

...