我已经尝试阅读此内容,但我仍然不明白它们的值(value)或它们取代的内容。它们会让我的代码更短、更容易理解吗?
更新
很多人都发布了答案,但很高兴看到有和没有传感器的例子,这些例子非常简单,即使是像我这样的白痴也能理解。当然,除非传感器需要一定的高水平的理解,在这种情况下我永远不会理解它们:(
最佳答案
传感器是在不知道底层序列是什么(如何做)的情况下如何处理数据序列的秘诀。它可以是任何 seq、异步 channel 或者可能是可观察的。
它们是可组合的和多态的。
好处是,您不必在每次添加新数据源时都实现所有标准组合器。一次又一次。因此,您作为用户可以在不同的数据源上重复使用这些配方。
在 Clojure 1.7 版本之前,您可以通过三种方式编写数据流查询:
嵌套调用
(reduce + (filter odd? (map #(+ 2 %) (range 0 10))))
功能组合
(def xform (comp (partial filter odd?) (partial map #(+ 2 %)))) (reduce + (xform (range 0 10)))
线程宏
(defn xform [xs] (->> xs (map #(+ 2 %)) (filter odd?))) (reduce + (xform (range 0 10)))
使用传感器,你可以这样写:
(def xform
(comp
(map #(+ 2 %))
(filter odd?)))
(transduce xform + (range 0 10))
他们都做同样的事情。不同之处在于,您从不直接调用转换器,而是将它们传递给另一个函数。传感器知道要做什么,传感器的功能知道如何做。组合器的顺序就像你用线程宏编写的一样(自然顺序)。现在您可以将 xform
与 channel 重用:
(chan 1 xform)
关于clojure - 有人可以用简单的术语向我解释 Clojure Transducers 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26317325/