Для языков, которые легко поддерживают каррирование и частичное применение, есть одна убедительная серия аргументов, исходная от Криса Окасаки:
- Поместите структуру данных в качестве последнего аргумента
Зачем? Затем вы можете красиво составлять операции с данными . Напр insert 1 $ insert 2 $ insert 3 $ s
. Это также помогает функциям в состоянии .
Стандартные библиотеки, такие как «контейнеры», следуют этому соглашению .
Иногда приводятся альтернативные аргументы, чтобы поместить структуру данных на первое место, чтобы ее можно было закрыть, давая функции статической структуры (например, поиск), которые являются немного более краткими. Однако, по общему мнению, это не лучший вариант, особенно потому, что он подталкивает вас к коду, сильно заключенному в скобки.
- Ставьте самые разные аргументы последними
Для рекурсивных функций обычно помещают аргумент, который больше всего изменяется (например, аккумулятор), в качестве последнего аргумента, а аргумент, который изменяется меньше всего (например, аргумент функции) в начале. Это хорошо сочетается с последним стилем структуры данных.
Краткое изложение взгляда Окасаки дано в его библиотеке Эдисона (опять же, другой библиотеке структур данных):
- Частичное применение : аргументы, которые с большей вероятностью будут статичными, обычно появляются перед другими аргументами, чтобы облегчить частичное применение.
- Коллекция отображается последней : во всех случаях, когда операция запрашивает отдельную коллекцию или изменяет существующую коллекцию, аргумент коллекции отображается последним. Это что-то вроде стандарта де-факто для библиотек структуры данных Haskell, который придает определенную согласованность API.
- Самый обычный порядок : там, где операция представляет собой известную математическую функцию для более чем одной структуры данных, аргументы выбираются в соответствии с наиболее обычным порядком аргументов для функции.
Сначала разместите аргументы, которые вы, скорее всего, будете использовать повторно. Аргументы функции - отличный тому пример. Скорее всего, вы захотите использовать
map f
два разных списка, чем сопоставить множество различных функций с одним и тем же списком.источник
map ($myList)
вместо этого составить список функций и поверх этого списка.Я обычно делаю то же, что и вы: выбираю какой-нибудь порядок, который кажется хорошим, а затем реорганизую его, если оказывается, что другой порядок лучше. Порядок во многом зависит от того, как вы собираетесь использовать функцию (естественно).
источник