2015-12-16 4 views
5
(defn unfold [step seed] 
    (if-let [[val new-seed] (step seed)] 
    (cons val (lazy-seq (unfold step new-seed))) 
    nil)) 

Beispiel Nutzung:Hat Clojure "Entfalten"?

(defn fib-step [[x y]] [x [y (+ x y)]]) 
(take 10 (unfold fib-step [0 1])) ;=> (0 1 1 2 3 5 8 13 21 34) 

(defn decreasing [x] (if (neg? x) nil [x (dec x)])) 
(unfold decreasing 5) ;=> (5 4 3 2 1 0) 

Ist dies oder etwas ähnliches in clojure Standard existieren (oder häufig verwendete) Libs? Wenn nicht, gibt es einen Grund, warum? Die nächstgelegene ich gefunden habe, ist diese Blog-Post:

http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure

Antwort

4

Nein, unfold nicht in Clojure umgesetzt. Es wird von amalloys flatland.useful Bibliothek zur Verfügung gestellt, die laut CrossClj eine breite Nutzung hat. Da der Blogbeitrag, den Sie verlinkt haben, eine ziemlich tiefgründige Erkundung des Themas bietet, vermute ich, dass Ihre Frage mehr ist, als eine direkte Antwort erfüllen kann ... Haben Sie ein Szenario im Kopf, bei dem iterate nicht ausreicht? Oder enttäuscht, dass iterate ist nicht ganz unfold in Name oder Verhalten?

(defn fib-step [[a b]] [b (+ a b)]) 
(take 10 (map first (iterate fib-step [0 1]))) 

(take-while (complement neg?) (iterate dec 5)) 

Ich ziehe iterate für diese Beispiele zu verwenden, da iterate bereits Teil des Kerns ist. Ich kann Leute sehen, die unfold bevorzugen, wenn ihnen das vertrauter ist.

Es gibt viele Bibliotheken, die "Dinge, die im Kern hätten sein sollen" wie https://weavejester.github.io/medley/medley.core.html. Eine schnelle Suche auf https://crossclj.info/ zeigt https://github.com/amalloy/useful enthält flatland.useful.seq/Entfalten, die, obwohl ich nicht verwendet habe aussieht, eine gute Implementierung von einem Clojure Core Contributor und kommt mit einigen anderen coolen Sachen zu booten.

+0

Ich habe vergessen, was mich motiviert hat, die Frage zu stellen, aber ich wollte nur eine bessere Vorstellung davon bekommen, wie man idiomatische Clojure für solche Aufgaben schreibt. Ich denke, Ihre Antwort liefert gute Informationen, nach denen ich gesucht habe. –

+0

groovy, danke! –