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? Здається, це досить поширена операція.