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