reduce
und apply
sind natürlich nur für assoziative Funktionen äquivalent (in Bezug auf das zurückgegebene Endergebnis), die alle ihre Argumente im Fall der variablen Arität sehen müssen. Wenn sie ergebnismäßig äquivalent sind, würde ich sagen, dass dies apply
immer vollkommen idiomatisch ist, während reduce
es in vielen Fällen äquivalent ist - und möglicherweise einen Bruchteil eines Augenblicks abschneidet. Was folgt, ist meine Begründung, dies zu glauben.
+
wird selbst in Bezug reduce
auf den Fall der variablen Arität implementiert (mehr als 2 Argumente). In der Tat scheint dies ein immens vernünftiger "Standard" -Weg für eine assoziative Funktion mit variabler Arität zu sein: Er reduce
hat das Potenzial, einige Optimierungen vorzunehmen, um die Dinge zu beschleunigen - vielleicht durch etwas wie internal-reduce
eine 1.2-Neuheit, die kürzlich im Master deaktiviert wurde, aber hoffentlich in Zukunft wieder eingeführt zu werden - was es dumm wäre, in jeder Funktion zu replizieren, die im vararg-Fall von ihnen profitieren könnte. In solchen Fällen apply
wird nur ein wenig Overhead hinzugefügt. (Beachten Sie, dass Sie sich keine Sorgen machen müssen.)
Andererseits kann eine komplexe Funktion einige Optimierungsmöglichkeiten nutzen, die nicht allgemein genug sind, um eingebaut zu werden reduce
. Dann können apply
Sie diese nutzen, während Sie reduce
möglicherweise tatsächlich langsamer werden. Ein gutes Beispiel für das letztere Szenario in der Praxis ist str
: Es verwendet ein StringBuilder
internes und profitiert erheblich von der Verwendung von apply
anstatt von reduce
.
Also, ich würde sagen, verwenden Sie, apply
wenn Sie Zweifel haben; und wenn Sie zufällig wissen, dass es Ihnen nichts überkauft reduce
(und dass sich dies wahrscheinlich nicht sehr bald ändern wird), können reduce
Sie diesen winzigen unnötigen Overhead verwenden, wenn Sie Lust dazu haben.
sum
Nebenbei bemerkt, warum nicht eine eingebaute Funktion wie in Haskell einbinden? Scheint eine ziemlich häufige Operation zu sein.