亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

怎樣用理解使用 Transducer?

怎樣用理解使用 Transducer?

元芳怎么了 2019-04-10 20:48:07
之前看過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 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

說多了都是痛,一個例子就夠了
首先是簡單的概念
reduce接收一個reducing函數和一個collection返回值,比如+是reducing函數
transducer接收一個reducing函數,返回一個新的reducing函數,(mapinc)返回transducer,而不是柯里化
所以這倆組合就變成
clojure(reduce((mapinc)+)[123]);;直接用transducer返回的新reducing函數reduce
如果沒有transducer是這樣的
clojure(reduce+(mapinc[123]));;先弄出個新數組,再reduce,多出來一步,慢,而且不lazy
想看稍微長一點的解釋可以看看我這篇文章,雖然寫給jsdev的,應該更好理解才是.
                            
查看完整回答
反對 回復 2019-04-10
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

Transducer據說是在開發core.async的過程中,RichHickey發現又在重新實現map,filter,partition等操作,這些操作與clojure/core中的sequence操作極為類似,只不過對象是異步通道而不是序列。因此他重新思考后引入了transducer概念,并重新實現了這些操作(1.7.0-alpha)。因此,transducer是未來的序列操作的基礎。你仍然可以象過去一樣使用序列操作,對我來說現在獲得的額外好處有:
可以用同樣的函數來處理異步問題和同步問題。
由于transducer是函數間的組合關系,它不用產生中間的數據對象,因此在不需要lazy的場合會有更好的運行效率。
我們過去使用序列時,一般都在寫轉換過程(transform),如(mapinc[012])其中的inc就是轉換過程?,F在我們可以:(defdo-inc(mapinc))來將對每個元素進行inc操作提取出來。還可以:(defdo-inc(comp(filtereven?)(mapinc)))將連續的轉換過程方便地組合,注意這個操作現在可以用在任何可以被reduce的對象上,包括但不限于序列、異步通道。
更重要的是,map,filter這些操作不過是transducer,它的作用是用transform參數來生成函數,我們可以寫作自己的transducer,而且可以是有狀態的transducer,這讓大設計更加容易。
                            
查看完整回答
反對 回復 2019-04-10
  • 2 回答
  • 0 關注
  • 385 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號