Transducerについて 2015-06-03 Clojure Lisp transducer # Transducerについて ---------------------- サイバーエージェント 朝の3分スピーチ === # About Me --------- ![κeenのアイコン](/images/icon.png) + κeen + [@blackenedgold](https://twitter.com/blackenedgold) + Github: [KeenS](https://github.com/KeenS) + 渋谷のエンジニア + Lisp, ML, Shell Scriptあたりを書きます === # Transducerって? ------------------ * Clojure 1.7で入るフレームワーク * 関数のパイプライン化を簡単にする * 入力、出力には依存しない === # Reduce関数について ------------------- * `reduce: ('a -> 'b -> 'a) 'a -> 'b list` * `('a -> 'b -> 'a)` でシーケンスを集約する * `(reduce + 0 '(1 2 3)) ;=> 6` * 要はreduceは関数を使って集約する。 === # Transducerについて ------------------- * `transduce:(('a -> 'b -> 'a) -> ('a -> 'b -> 'a)) ('a -> 'b -> 'a) 'a -> 'b list` * 集約関数を変換する関数もとる * `(transduce xf + 0 '(1 2 3))` * transducerで集約する前に処理を挟める === # すごいところ ------------------------- ## コンポーサビリティ * `(('a -> 'b -> 'a) -> ('a -> 'b -> 'a))` * 変換関数は入力と出力が同じ。 * つまり変換関数を合成出来る * ex) `(comp (filter odd?) (map inc))` === # すごいところ2 -------------------------- ## 汎用性 * 各関数は入力や出力について知る必要はない + シーケンスではなく要素に対して定義される * シーケンスだけでなく遅延シーケンス、ストリーム、チャネルなどなどにも使える * 中間シーケンスを作らない + 遅延シーケンスやストリームには大きなメリット * 集約先をシーケンスなどにすることも出来る + 関数の汎用性が上がる === # すごいところ3 -------------- ## 並列/非同期 * core.asyncもtransducerをサポート * 各変換関数を並列/非同期に実行が可能 * さらに各関数に割り当てるプロセッサの数も細かく制御出来る === 変換して === 集約する === 何かに似てない? === MapReduce === @oza_x86 ozaさんの近しい環境というとHadoop...多段Mapreduceをtransdecerみたいにしようってはなしとかですか?— κeen (@blackenedgold) 2015, 6月 1 === @blackenedgold まさにその通りです.MapReduce には Combiner という中間集約をする API があるのですが,それをもっと汎用的にしようという話です. http://t.co/injEiPjePG— oza (@oza_x86) 2015, 6月 1 === @oza_x86 すごい楽しそうですね。Clojure向けのAPIがtransducerのバッグエンドになって普段書いてるコードがそのままHadoopで動いたりしたら、とか夢が無限に広がります— κeen (@blackenedgold) 2015, 6月 1 === @blackenedgold おお,その案は良いですね!!— oza (@oza_x86) 2015, 6月 1 === Clojure 1.7 + Transducer === Comming Soon === # 参考 ------ * [Clojure 1.7のtransducersを動かしてみよう - Qiita](http://qiita.com/tokomakoma123/items/1ca3fb0dddc5b901b032) * [core.async+transducers Shibuya.lisp #21](http://www.slideshare.net/ktsujister/coreasynctransducers-shibuyalisp-21) * [Hadoop Combinerメモ(Hishidama's Hadoop Combiner Memo)](http://www.ne.jp/asahi/hishidama/home/tech/apache/hadoop/Combiner.html)