📝Clojure Transducer
up: 📂Clojure Core
Transducerとは #
Clojure 1.7より追加されたライブラリ.
- reduce(高階関数) の概念を拡張.
- 合成可能なアルゴリズム変換.
- 関数合成(comp)により組み合わせ可能
- (transducer + transducer => transducer).
- composableな ストラテジパターン.
- 入力源や出力先によらず各要素を変換.
reducing functionとtransducerの定義 #
まずは用語の定義, 大事なので注意.
reducing function とはaccumulateされた結果と新しいinputを合わせて新しいaccumulateを生成する関数. (accumulateがなんと訳すのかわからないけど, いわゆるreduce関数だ).
;; reducing function signature
whatever, input -> whatever
transducer とはあるreducing functionを別のreducing functionに変換する.
;; transducer signature
(whatever, input -> whatever) -> (whatever, input -> whatever)
Transducerの作り方 #
ClojureのCollectionを処理する関数のうちcollを引数に持たない場合は大抵それがtransducerの関数となっている.
(filter odd?) ;; 奇数をフィルタするトランスデューサーを返す
(map inc) ;; incによるマッピングを行うトランスデューサーを返す
(take 5) ;; 最初の5つの値を取得するトランスデューサーを返す
そしてこれらのtransducerを組み合わせるには comp を使う.
(def xf
(comp
(filter odd?)
(map inc)
(take 5)))
Transducerとスレッディングマクロ(-»)との関係 #
Transducerとはmapやfilterのcollectionを省いて変換処理だけ抜き出してまとめたもの.
(->> coll
(map proc1)
(filter proc2)
(map proc3)
(map proc4))
スレッディングマクロで表現されるような4つの処理をたとえば2つをまとめて操作として抽象したり, さらにその関数値を引数にすれば部分的に交換な部品ができたりする.
🔗References #
- Understanding Transducers - Elben Shira
- ClojureScript Unraveled (2nd edition)
- Reducers, Transducers, and core.async in Clojure - DZone Java
- Reducers A Library and Model for Collection Proc - Rich Hickey - YouTube
- 先生のreduceについての詳細解説.
あんまり日本語情報ないな…
JavaScriptを用いたtransduceの概念の説明.