首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >core.async中的状态换能器

core.async中的状态换能器
EN

Stack Overflow用户
提问于 2016-01-21 19:33:01
回答 1查看 477关注 0票数 2

我试图了解如何在core.async中制作状态传感器。例如,我如何制作一个传感器来统计通过一个通道来的元素的数量?例如,我希望将输入转换为一个计数,该计数取决于它之前的对象的数量。

从我读到的方法来看,使用volatile!来保持换能器内部的状态,但我仍然不知道如何把所有的东西放在一起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-21 20:26:07

您需要一个状态转换器,返回一个关闭在volatile!上的还原函数,跟踪计数。

代码语言:javascript
复制
(defn count-xf [rf]
  (let [ctr (volatile! 0)]
    (fn
      ([] (rf))
      ([result] (rf result))
      ([result _]                         ; we ignore the input as
       (rf result (vswap! ctr inc))))))   ; we just pass on the count

这可以使用核心函数completing进行简化。

代码语言:javascript
复制
(defn count-xf [rf]
  (let [ctr (volatile! 0)]
    (completing
     (fn [result _]
       (rf result (vswap! ctr inc))))))

例如:使用它

代码语言:javascript
复制
(let [ch (chan 1 count-xf)]
  (onto-chan ch (repeat 10 true))
  (<!! (clojure.core.async/into [] ch)))

;-> [1 2 3 4 5 6 7 8 9 10]

或者,您可以只使用map-indexed换能器,但这可能会降低您对换能器工作原理的了解。而且,对于这个特定的使用过程,它需要每步增加一些额外的开销。

代码语言:javascript
复制
(def count-xf (map-indexed (fn [i _] (inc i))))

注意到它的实现与上面的实现没有什么不同。

进一步参考:http://clojure.org/reference/transducers

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34932717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档