2017-02-03 7 views
4

私はリストのコレクションを持っています。コレクションの各リストに "reduce +"を適用したいと思います。私は "適用する"、 "マップする"、 "減らす"を組み合わせるべきだと思いますが、私はどのように理解できません。 例: [[1 2 3] [4 5 3] [2 5 1]] => [6 12 8]seqの要素ごとにreduceを適用する

答えて

4

applyは不要です。 mapreduceが正常に動作します:

(map (partial reduce +) [[1 2 3] [4 5 3] [2 5 1]]) 

mapをリストの各メンバーに関数を呼び出すとpartialは、単にそれが一つのパラメータを期待減らすの「カレー」バージョンを作成します。それも

更新#(reduce + %)または(fn [lst] (reduce + lst))

のように書くことができますが、実際には(両方だけではない)もここに減らすの代わりに適用されます使用することもできます

(map (partial apply +) [[1 2 3] [4 5 3] [2 5 1]]) 

さらに

を更新

パフォーマンスに関する懸念がある場合は、@AlexMillerのヒントについてはこの回答のコメントをご覧ください

+1

これらの2つの間で 'reduce'が優先され、特にサブベクトルが大きい場合にはより高速になる可能性があります。 –

+0

@AlexMiller私はその勧告に同意しません。現時点では 'apply +'は 'reduce +'に委譲しているので、速度の差は特に大きなベクトルの場合には無視できる。 http://stackoverflow.com/a/3153643/625403にあるように、 'apply'は常に' reduce'に委譲するオプションがありますが、減らすことができない特別な最適化を利用することができます。その逆は真実ではない。 – amalloy

+0

私は具体的に、この回答で 'apply +'と 'reduce +'を比較することについて話していましたが、一般的なケースではありません(ほとんどの場合、reduceは適用同等物よりも明瞭で速いと思います。あなたが言及しているように、ここでのオーバーヘッドはタイミングだけです。https://gist.github.com/puredanger/88d0491cbb4dbf8fe98b3747963d0068 –

関連する問題