📝Clojure Transducer

📝Clojure Transducer

up: 📂Clojure Core

Transducerとは #

Clojure 1.7より追加されたライブラリ.

  • reduce(高階関数) の概念を拡張.
  • 合成可能なアルゴリズム変換.
  • 入力源や出力先によらず各要素を変換.

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 #

あんまり日本語情報ないな…

JavaScriptを用いたtransduceの概念の説明.