2016-12-25 4 views
5

Der einzige Vorteil, den ich sehen kann, ist, dass man Anrufe zu partial vermeidet.warum ist clojure thread zuletzt (- >>) ein Makro?

(defn foldl [f acc xs] 
    (loop [acc acc 
     xs xs] 
    (if (empty? xs) 
     acc 
     (recur (f (first xs) acc) (rest xs))))) 

(defn $ [f x] (f x)) 

(defn thread-last [x & rest] 
    (foldl $ x rest)) 

die gibt:

(thread-last (range 10) 
      (partial map inc) 
      (partial filter odd?) 
      (partial reduce +)) => 25 

(->> (range 10) 
    (map inc) 
    (filter odd?) 
    (reduce +)) => 25 

Gibt es Fälle, in denen eine funktionelle/explizite Version scheitern würde?

+0

Fragen Sie nach Fällen, in denen das "Teilen" am Anfang jedes Formulars nicht funktioniert, oder fragen Sie nach * nützlichen * Fällen? –

+0

der erste, wie in welchen Fällen konnte man nicht teilweise (oder ein Lambda für die Argumentation) verwenden. – beoliver

Antwort

12

Beachten Sie zuerst, dass Ihre foldl nur reduce ist. Unsere Sprache ist nicht , die viel ärmer als Haskell!

Zweitens sind nicht alle Formulare Funktionsaufrufe, und ->> kann alle Formulare neu schreiben. Zum Beispiel könnten Sie ->> verwenden, um etwas ein bisschen wie Haskells where Klauseln zu implementieren:

(defn mapcat' [f xs] 
    (->> (apply concat mapped) 
     (let [mapped (map f xs)]))) 

Nicht wirklich ein Stil, der mit Clojure Programmierer beliebt ist, aber es dient als Beispiel für etwas ->> tun kann, dass partial kann‘ t.

+0

Keine negativen Konnotationen wurden beabsichtigt :) Ich benutze Clojure in der Produktion in diesen Tagen, so dass es mehr darum geht, jede "Magie" zu zerstreuen. Ich habe foldl geschrieben, als ich mit einem foldl-while und anderen Konstrukten herumspielte. – beoliver