为什么clojure线程最后一个( - >>)一个宏?

时间:2016-12-25 21:10:02

标签: clojure macros

我能看到的唯一好处是,这意味着可以避免拨打partial

(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

是否存在功能/显式版本失败的情况?

1 个答案:

答案 0 :(得分:12)

首先,请注意您的foldl只是reduce。我们的语言 比Haskell差得多!

其次,并非所有表单都是函数调用,->>可以重写所有表单。例如,您可以使用->>来实现类似Haskell的where子句:

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

并不是一种受Clojure程序员欢迎的风格,但它可以作为->>无法做到的事情的一个例子。