reduceund applysind 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 applyimmer vollkommen idiomatisch ist, während reducees 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 reduceauf 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 reducehat das Potenzial, einige Optimierungen vorzunehmen, um die Dinge zu beschleunigen - vielleicht durch etwas wie internal-reduceeine 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 applywird 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 applySie diese nutzen, während Sie reducemöglicherweise tatsächlich langsamer werden. Ein gutes Beispiel für das letztere Szenario in der Praxis ist str: Es verwendet ein StringBuilderinternes und profitiert erheblich von der Verwendung von applyanstatt von reduce.
Also, ich würde sagen, verwenden Sie, applywenn 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 reduceSie diesen winzigen unnötigen Overhead verwenden, wenn Sie Lust dazu haben.
sumNebenbei bemerkt, warum nicht eine eingebaute Funktion wie in Haskell einbinden? Scheint eine ziemlich häufige Operation zu sein.