clojure - 有人可以用简单的术语向我解释 Clojure Transducers 吗?

标签 clojure transducer

我已经尝试阅读此内容,但我仍然不明白它们的值(value)或它们取代的内容。它们会让我的代码更短、更容易理解吗?

更新

很多人都发布了答案,但很高兴看到有和没有传感器的例子,这些例子非常简单,即使是像我这样的白痴也能理解。当然,除非传感器需要一定的高水平的理解,在这种情况下我永远不会理解它们:(

最佳答案

传感器是在不知道底层序列是什么(如何做)的情况下如何处理数据序列的秘诀。它可以是任何 seq、异步 channel 或者可能是可观察的。

它们是可组合的和多态的。

好处是,您不必在每次添加新数据源时都实现所有标准组合器。一次又一次。因此,您作为用户可以在不同的数据源上重复使用这些配方。

在 Clojure 1.7 版本之前,您可以通过三种方式编写数据流查询:

  1. 嵌套调用

    (reduce + (filter odd? (map #(+ 2 %) (range 0 10))))
    
  2. 功能组合

    (def xform
      (comp
        (partial filter odd?)
        (partial map #(+ 2 %))))
    (reduce + (xform (range 0 10)))
    
  3. 线程宏

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

相关文章:

clojure - Clojure 是否有一个记住插入顺序的集合?

Clojure - 为什么 into 对列表的行为不同于对向量的行为?

Clojure - 当 `comp` 从右到左时,这是如何工作的?

computer-science - 什么是有限状态传感器?

f# - 值(value)限制问题

optimization - 在 Clojure 中,我可以优化扫描吗?

hash - Clojure映射限制和一致性

unit-testing - 如何使用 `with-redefs` 始终从函数中抛出异常

clojure - 实现 Clojure 条件/分支转换器