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

Заказ параметров для использования каррирования

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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


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

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

Ответ 2

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

Ответ 3

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