reduce
і apply
, звичайно, є лише еквівалентними (з точки зору поверненого кінцевого результату) асоціативних функцій, яким потрібно бачити всі їх аргументи у випадку змінної арності. Коли вони є рівнозначним результатом, я б сказав, що apply
це завжди ідеально ідіоматичноreduce
як рівнозначний - і може збрити частину моргання очей - у багатьох поширених випадках. Далі - це моє обґрунтування вірити цьому.
+
сама реалізована з точки зору випадку reduce
із змінною ар-тією (більше 2 аргументів). Дійсно, це здається надзвичайно розумним "за замовчуванням" способом вирішити будь-яку асоціативну функцію із змінною сукупністю: reduce
має потенціал для здійснення деяких оптимізацій для прискорення роботи - можливо, через щось на кшталт internal-reduce
, нещодавно відключена новинка 1,2 в майстрі, але сподіваємось, знову буде запроваджено в майбутньому - що було б нерозумно повторювати у кожній функції, яка може мати користь від них у випадку vararg. У таких поширених випадках apply
просто додасть трохи накладних витрат. (Зверніть увагу, що насправді не варто турбуватися.)
З іншого боку, складна функція може скористатися деякими можливостями оптимізації, які недостатньо загальні для вбудування reduce
; тоді apply
ви дозволили б скористатися тими, хоча reduce
вони насправді можуть сповільнити вас. Хороший приклад останнього сценарію, що виникає на практиці, наводить str
: він використовує StringBuilder
внутрішньо і значно виграє від використання, apply
а не reduce
.
Отже, я б сказав, використовуйте, apply
коли сумніваєтесь; і якщо вам здається, що ви знаєте, що це не купує вам нічого надто reduce
(і що це навряд чи зміниться дуже скоро), сміливо використовуйте reduce
для того, щоб збрити цю мінливу непотрібну накладну, якщо вам це здається.
sum
функцію, як у haskell? Здається, це досить поширена операція.