2016-12-25 2 views
5

Единственное преимущество, которое я могу видеть, это то, что он позволяет избежать звонков на partial.Почему clojure thread last (- >>) макрос?

(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)) 

, который дает:

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

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

Есть ли случаи, когда функционал/Явная версия потерпит неудачу?

+0

Запрашиваете ли вы случаи, когда в начале каждой формы вставлять 'partial' не будет, или вы запрашиваете * полезные * такие случаи? –

+0

первый, так как в каких случаях нельзя было использовать частичный (или лямбда для размещения аргументов). – beoliver

ответ

12

Во-первых, обратите внимание, что ваш foldl - это всего лишь reduce. Наш язык не , что намного беднее, чем Haskell!

Во-вторых, не все формы являются функциональными вызовами, а ->> могут переписывать все формы. Например, вы могли бы использовать ->> реализовать что-то немного как where статей в Haskell:

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

Не совсем стиль, который пользуется популярностью у Clojure программистов, но он служит в качестве примера то, ->> может сделать это partial может» т.

+0

Не было никаких негативных коннотаций. Я использую clojure в производстве в наши дни, поэтому больше о том, чтобы рассеять любую «магию». Я написал foldl, когда я играл со складками и другими конструкциями. – beoliver