2017-04-03 13 views
0

clojure.core.reducersの代替手段map-indexedはありますか? r/map(新しいシーケンスを作成しないでください)のようにゆっくりと動作するものが欲しいです。還元剤の代わりにmap-indexed代替手段

+0

あなたが唯一の減速にバインドされていない場合、あなたができます'map-indexed'のトランスデューサバージョンを使用すると、中間のコレクションを作成するのを避けることができます – leetwinski

答えて

5

私はmap-indexedは、トランスデューサを返す1-アリティのバージョンを(mapfilter、および他の多くのコア機能と同様に)持っているので、何が本当に使いたいが、transducerであると思われます。トランスデューサは合成可能であり、中間シーケンスを作成しません。ここで簡単な例である:

(def xf (comp 
      (map-indexed (fn [i value] [i value])) 
      (filter (fn [[i value]] (odd? i))) 
      (map second))) 

この言う:インデックスが奇数ベクトルのみをフィルタリング、map-indexedを使用して索引付けベクトルを生成し、第2の素子を得ます。 (filter odd? collection)と言ってもそれは長らく残念ですが、それはあくまで例です。

(into [] xf "ThisIsATest") 
=> [\h \s \s \T \s] 

か、transduce機能を使用して、結果にstrを適用することができます:

あなたはintoでこれを使用することができます

(transduce xf str "ThisIsATest") 
=> "hssTs" 
+1

素敵で、きれいでシンプルです。また、 "Transducer De-Mystifier"の例としてタグ付けする必要があります。 –

+1

これは実際には '(filter odd?coll)'ではありません。値ではなくインデックスでフィルタリングしているからです。むしろ、それは '(take-nth 2(rest coll))'です。 – amalloy