之前看过Clojure作者的演讲:http://www.tudou.com/programs/view/5y_hDVID7gQ/http://www.tudou.com/programs/view/PqdnO8uU6UU/现在又看了一个JavaScript的教程:http://phuu.net/2014/08/31/csp-and-transducers.html大意Transducer是从reduce抽象出来的跟数据结构无关的序列操作的新办法(?),而且还能作为函数任意复合(?),不知道是不是这个意思...有没有同学熟悉这方面,而且能用生动的例子讲解一下原理,特别还有怎么用的?
2 回答
慕标琳琳
TA贡献1830条经验 获得超9个赞
说多了都是痛,一个例子就够了首先是简单的概念reduce接收一个reducing函数和一个collection返回值,比如+是reducing函数transducer接收一个reducing函数,返回一个新的reducing函数,(mapinc)返回transducer,而不是柯里化所以这俩组合就变成clojure(reduce((mapinc)+)[123]);;直接用transducer返回的新reducing函数reduce如果没有transducer是这样的clojure(reduce+(mapinc[123]));;先弄出个新数组,再reduce,多出来一步,慢,而且不lazy想看稍微长一点的解释可以看看我这篇文章,虽然写给jsdev的,应该更好理解才是.
森栏
TA贡献1810条经验 获得超5个赞
Transducer据说是在开发core.async的过程中,RichHickey发现又在重新实现map,filter,partition等操作,这些操作与clojure/core中的sequence操作极为类似,只不过对象是异步通道而不是序列。因此他重新思考后引入了transducer概念,并重新实现了这些操作(1.7.0-alpha)。因此,transducer是未来的序列操作的基础。你仍然可以象过去一样使用序列操作,对我来说现在获得的额外好处有:可以用同样的函数来处理异步问题和同步问题。由于transducer是函数间的组合关系,它不用产生中间的数据对象,因此在不需要lazy的场合会有更好的运行效率。我们过去使用序列时,一般都在写转换过程(transform),如(mapinc[012])其中的inc就是转换过程。现在我们可以:(defdo-inc(mapinc))来将对每个元素进行inc操作提取出来。还可以:(defdo-inc(comp(filtereven?)(mapinc)))将连续的转换过程方便地组合,注意这个操作现在可以用在任何可以被reduce的对象上,包括但不限于序列、异步通道。更重要的是,map,filter这些操作不过是transducer,它的作用是用transform参数来生成函数,我们可以写作自己的transducer,而且可以是有状态的transducer,这让大设计更加容易。
添加回答
举报
0/150
提交
取消