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