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