【问题标题】:why is clojure thread last (->>) a macro?为什么clojure thread last (->>) 是一个宏?
【发布时间】:2016-12-25 21:10:02
【问题描述】:

我能看到的唯一好处是它意味着人们可以避免调用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

是否存在函数式/显式版本失败的情况?

【问题讨论】:

  • 您是在询问在每个表格的开头粘贴partial 不起作用的情况,还是在询问有用这样的情况?
  • 第一个,因为在这种情况下不能使用部分(或用于参数放置的 lambda)。

标签: clojure macros


【解决方案1】:

首先,请注意您的foldl 只是reduce。我们的语言并没有那么比 Haskell 差多少!

第二,不是所有的表单都是函数调用,->>可以重写所有的表单。例如,您可以使用 ->> 来实现有点像 Haskell 的 where 子句的东西:

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

这并不是一种真正受 Clojure 程序员欢迎的风格,但它可以作为 ->> 可以做到而 partial 不能做到的示例。

【讨论】:

  • 没有任何负面含义 :) 这些天我在生产中使用 clojure,所以它更多地是为了消除任何“魔法”。我在玩 foldl-while 和其他结构时写了 foldl。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
相关资源
最近更新 更多