Ich werde Teufel Advokat spielen und für apply
argumentieren.
reduce
ist nehmen die clojure auf fold
(genauer foldl
), die linke-fach, und wird in der Regel mit einem Anfangselement definiert, da eine Falte Betrieb hat zwei Teile:
so die Summe als finden et of numbers die natürliche Weise zu verwenden +
ist wie (fold + 0 values)
oder in clojure, (reduce + 0 values)
.
zeigt dies ausdrücklich das Ergebnis für eine leere Liste, was wichtig ist, weil es nicht mir klar ist, dass +
kehrt 0
in diesem Fall - immerhin +
ist ein Binäroperators (alle, dass fold
Bedürfnisse oder annimmt) .
jetzt, in der Praxis stellt sich heraus, dass Clojure +
als mehr als ein binärer Operator definiert ist. es wird viele oder sogar Nullwerte benötigen. cool. aber wenn wir diese "extra" Informationen verwenden, ist es freundlich, dies dem Leser zu signalisieren. (apply + values)
tut dies - es sagt "ich benutze + auf seltsame Weise, als mehr als ein binärer Operator". und das hilft den Leuten (ich zumindest) den Code zu verstehen.
[es ist interessant zu fragen, warum apply
fühlt sich klarer an. und ich denke, es ist teilweise, dass Sie dem Leser sagen: "Schau, +
wurde entwickelt, um mehrere Werte zu akzeptieren (das ist, was gelten für verwendet wird), und so die Sprachimplementierung wird den Fall von Null-Werte enthalten." Dieses implizite Argument ist nicht vorhanden, wenn reduce
auf eine einzige Liste angewendet wird.]
Alternativ ist (reduce + 0 values)
auch in Ordnung. aber (reduce + values)
löst eine instinktive Reaktion in mir aus: "huh, gibt +
eine Null?".
und wenn Sie nicht einverstanden sind, dann, bitte, bevor Sie eine Antwort ablehnen oder posten, sind Sie sicher über was (reduce * values)
wird für eine leere Liste zurückkehren?
möglich Duplikat von [Clojure: reduzieren vs. apply] (http://stackoverflow.com/questions/3153396/clojure-reduce-vs-apply). Die verknüpfte Frage ist neuer als diese, aber es hat IMO bessere Antworten, also nominiere ich es als den Überlebenden. – amalloy