我能看到的唯一好处是,这意味着可以避免拨打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
是否存在功能/显式版本失败的情况?
答案 0 :(得分:12)
首先,请注意您的foldl
只是reduce
。我们的语言 比Haskell差得多!
其次,并非所有表单都是函数调用,->>
可以重写所有表单。例如,您可以使用->>
来实现类似Haskell的where
子句:
(defn mapcat' [f xs]
(->> (apply concat mapped)
(let [mapped (map f xs)])))
并不是一种受Clojure程序员欢迎的风格,但它可以作为->>
无法做到的事情的一个例子。