Clojure Wandler Verhalten
Mit der neuen Clojure 1.7 habe ich mich entschlossen zu verstehen, wo ich Schallköpfe verwenden kann. Ich verstehe, welchen Nutzen sie bringen können, aber ich kann keine normalen Beispiele für das Schreiben von benutzerdefinierten Schallköpfen mit Erklärungen finden.
Ok, ich habe versucht zu testen, was passiert. Ich habe die Clojure-Dokumentation geöffnet. Und dort Beispiele verwendenxf
als Argument. Erstens: Was bedeutet dieses xf oder xfrom? Dieses Zeug produzierte Identitätswandler.
(defn my-identity [xf]
(fn
([]
(println "Arity 0.")
(xf))
([result]
(println "Arity 1: " result " = " (xf result))
(xf result))
([result input]
(println "Arity 2: " result input " = " (xf result input))
(xf result input))))
Ich habe die Benennung von Variablen übernommen[result input]
aus Dokumentationsbeispiel. Ich dachte, es ist wie in Funktion reduzieren, woresult
ist reduzierter Teil undinput
ist ein neues Auflistungselement.
So wenn ich @ mac(transduce my-identity + (range 5))
Ich habe Ergebnis10
was ich erwartet hatte. Dann las ich übereduction
, aber ich kann nicht verstehen, was es ist. Trotzdem habe ich @ gemac(eduction my-identity (range 5))
und bekam:
Arity 2: nil 0 = nil
Arity 2: nil 1 = nil
Arity 1: nil = nil
(0 0 1 1)
Jeder Artikel wurde dupliziert, weil ich @ anruxf
imprintln
Erklärung. Warum wurde jeder Artikel zweimal dupliziert? Warum habe ich null bekommen? Werde ich immer null bekommen, wenn ich eine Abrechnung mache? Kann ich dieses Verhalten weitergeben?
ie auch immer, ich habe
> (reduce + (eduction my-identity (range 5))
clojure.core.Eduction cannot be cast to clojure.lang.IReduce
Ok, das Ergebnis ist einEduction
das ist NICHT reduzierbar, wird aber wie eine Liste gedruckt. Warum ist es nicht reduzierbar? Wenn ich @ einge(doc eduction)
Ich verstehe da
Returns a reducible/iterable application of the transducers
to the items in coll.
Sollte nicht(transduce xform f coll)
und(reduce f (eduction xfrom coll))
das gleiche sein?
Ich macht
> (reduce + (sequence my-identity (range 5))
20
atürlich habe ich20
wegen Duplikaten. Wieder dachte ich, es sollte sein, dass(transduce xform f coll)
und(reduce f (sequence xfrom coll))
Mindestens in einem so kleinen Beispiel ohne zustandsbehaftete Wandler immer gleich sein. Ist das doof, dass sie nicht sind, oder irre ich mich?
Ok, dann habe ich versucht(type (sequence my-identity (range 5)))
und clojure.lang.LazySeq bekommen Ich dachte, dass es faul ist, aber als ich versuchte, das @ zu nehmfirst
element clojure hat die gesamte Sequenz auf einmal berechnet.
Also meine Zusammenfassung:
1) Was bedeutet xf oder xform?
2) Warum bekomme ichnil
Als einresult
Argument währendeduction
odersequence
?
3) Könnte ich immer sicher sein, dass es @ sein winil
whileeduction
odersequence
?
4) Was isteduction
und was ist die idiomatische Idee, dass es nicht reduzierbar ist? Oder wenn ja, wie kann ich das reduzieren?
5) Warum ich Nebenwirkungen bekomme, währendsequence
odereduction
?
6) Kann ich mit Wandlern aktuelle Lazy-Sequenzen erstellen?