Упорядочение параметров для использования карри - PullRequest
90 голосов
/ 03 мая 2011

Я недавно дважды реорганизовал код для изменения порядка параметров, потому что было слишком много кода, где происходили такие хаки, как flip или \x -> foo bar x 42.

При разработке сигнатуры функции, какие принципы будутпомогите мне лучше всего использовать карри?

Ответы [ 3 ]

107 голосов
/ 03 мая 2011

Для языков, которые легко поддерживают каррирование и частичное применение, есть одна убедительная серия аргументов, первоначально от Криса Окасаки:

  • Поместить структуру данных в качестве последнего аргумента

Почему? Затем вы можете хорошо составлять операции над данными . Например. insert 1 $ insert 2 $ insert 3 $ s. Это также помогает для функций в состоянии .

Стандартные библиотеки, такие как «контейнеры» , следуют этому соглашению .

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

  • Поставьте самый изменяемый аргумент последним

Для рекурсивных функций обычно аргумент, который больше всего варьируется (например, аккумулятор), является последним аргументом, а аргумент, который меняет меньше всего (например, аргумент функции), в начале. Это хорошо сочетается с последним стилем структуры данных.


Краткая информация о представлении Okasaki приведена в его библиотеке Edison (опять же, другая библиотека структуры данных):

  • Частичное применение : аргументы, которые с большей вероятностью являются статическими, обычно появляются перед другими аргументами, чтобы облегчить частичное применение.
  • Коллекция появляется последней : во всех случаях, когда операция запрашивает одну коллекцию или изменяет существующую коллекцию, аргумент коллекции будет появляться последним. Это является стандартом де-факто для библиотек структур данных Haskell и обеспечивает определенную согласованность с API.
  • Самый обычный порядок : где операция представляет собой известную математическую функцию для более чем одной структуры данных, аргументы выбираются так, чтобы соответствовать наиболее обычному порядку аргументов для функции.
11 голосов
/ 03 мая 2011

Поместите аргументы, которые вы, скорее всего, будете использовать первыми. Аргументы функции являются отличным примером этого. Вы, скорее всего, захотите map f для двух разных списков, чем для сопоставления множества разных функций в одном и том же списке.

3 голосов
/ 03 мая 2011

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

...