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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage