Paul ChiusanoRúnar Óli写了一本很棒的书Functional programming in Scala。他们在其中提到了Scala社区中很少提及的概念-换能器​​。

在Clojure社区-Transducers中获得一个little more press

我的问题是: Scala传感器**(摘自《 Scala的函数编程》)和Clojure传感器有什么异同?**

假设:

我知道

  • 换能器是their concept in Electrical Engineering的常见说法
  • 有一个预先存在的概念in Computer Science called a Finite State Transducer
  • 有先例in Biology and Psychology adopting the word transduction
  • 还有其他技术书籍的already a history,例如SICP adopting the word Transducers
  • 最佳答案

    我并不特别熟悉Scala的换能器概念或该术语的普遍性,但是从上面您发布的文本片段(以及我对换能器的了解)中,我可以说的是:

  • 它们是非常不同的
  • 它们的相似之处仅在于它们都与一个人如何将一个集合转换为另一个
  • 有关。

    关于Scala换能器,我可以说些什么:

    从上面的定义看来,任何带有签名的函数或可调用对象的大致含义如下:
    Stream[A] -> Stream[B]
    

    因此,例如,在这种情况下,工作流的映射函数将算作换能器。

    就是这样;真的很简单。

    Clojure换能器:

    Clojure transducer是将一个归约函数转换为另一个归约函数的函数。归约函数是可以与reduce一起使用的函数。也就是说,如果Clojure有签名,那么它将有签名
    (x, a) -> x
    

    用英语,给定一些开始的集合x,并减少集合中的“下一个事物” a,我们的减少函数将返回“正在构建的集合的下一个迭代”。

    因此,如果这是归约函数的签名,则换能器具有签名
    ((x, a) -> x) -> ((x, b) -> x)
    

    将换能器添加到Clojure的原因是,通过添加或 core.async channel ,Rich Hickey和 friend 发现自己重新实现了所有stanard收集功能以使用 channel (mapfiltertake等)。 RH想知道这里是否还有更好的方法,因此开始着手研究如何从手头的收集类型的机制中了解这些各种收集处理功能的逻辑。我认为,确切解释换能器的工作方式超出了这个问题的范围,因此,我将回到正题。但是,如果您感兴趣,有很多关于此的文献很容易找到和研究。

    那么这些东西是如何关联的呢?

    显然,这些是非常不同的概念,但是我将它们看作是相关的:

    Scala换能器是Streams的集合处理功能(与其他Scala集合并置),而Clojure的换能器实际上是一种统一跨不同集合类型实现集合处理功能的机制。因此,一种表达方式是,如果Scala具有Clojure的换能器概念,则可以使用Clojure的换能器概念来实现Scala的换能器概念,后者是可用于多种集合类型的更抽象/通用的处理功能。

    关于scala - Scala换能器与Clojure换能器之间有何异同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27816946/

    10-10 10:11