reduce
i apply
są 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 apply
zawsze 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 reduce
dla 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: reduce
ma potencjał do wykonania pewnych optymalizacji, aby przyspieszyć działanie - być może poprzez coś w rodzaju internal-reduce
nowoś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 apply
po 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 apply
pozwolili skorzystać z tych chwili reduce
rzeczywiście może spowolnić. Dobrym przykładem tego drugiego scenariusza występującego w praktyce jest str
: wykorzystuje StringBuilder
wewnętrznie i odniesie znaczne korzyści z użycia apply
zamiast reduce
.
Więc powiedziałbym, że używaj apply
w 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 reduce
ogolić to drobne niepotrzebne obciążenie, jeśli masz na to ochotę.
sum
funkcji, takiej jak w haskell? Wydaje się, że to dość powszechna operacja.