reducei applysą oczywiście równoważne tylko (pod względem zwróconego ostatecznego wyniku) dla funkcji asocjacyjnych, które muszą widzieć wszystkie swoje argumenty w przypadku zmiennej-arity. Kiedy są równoważne wynikom, powiedziałbym, że applyzawsze jest to idealnie idiomatyczne, podczas gdyreduce jest równoważne - i może skrócić o ułamek mrugnięcia oka - w wielu typowych przypadkach. Oto moje uzasadnienie, aby w to wierzyć.
+jest zaimplementowany w kategoriach reducedla przypadku zmiennej-arity (więcej niż 2 argumenty). Rzeczywiście, wydaje się to niezmiernie rozsądnym "domyślnym" sposobem na zastosowanie dowolnej funkcji asocjacyjnej o zmiennej arsenale: reducema potencjał do wykonania pewnych optymalizacji, aby przyspieszyć działanie - być może poprzez coś w rodzaju internal-reducenowości 1.2 ostatnio wyłączonej w trybie głównym, ale miejmy nadzieję, że zostaną ponownie wprowadzone w przyszłości - co byłoby głupio powielać w każdej funkcji, która mogłaby z nich skorzystać w przypadku vararg. W takich typowych przypadkach applypo prostu doda trochę narzutów. (Zauważ, że nie ma się czym martwić.)
Z drugiej strony, funkcja złożona może wykorzystywać pewne możliwości optymalizacji, które nie są na tyle ogólne, aby można je było wbudować reduce; następnie applypozwolili skorzystać z tych chwili reducerzeczywiście może spowolnić. Dobrym przykładem tego drugiego scenariusza występującego w praktyce jest str: wykorzystuje StringBuilderwewnętrznie i odniesie znaczne korzyści z użycia applyzamiast reduce.
Więc powiedziałbym, że używaj applyw razie wątpliwości; a jeśli zdarzy ci się wiedzieć, że nie kupuje ci to niczego ponad reduce(i że jest mało prawdopodobne, aby to się wkrótce zmieniło), możesz swobodnie reduceogolić to drobne niepotrzebne obciążenie, jeśli masz na to ochotę.
sumfunkcji, takiej jak w haskell? Wydaje się, że to dość powszechna operacja.