同じ引数 (A: juxt) を持つ複数の関数をマップする関数についての質問に答える際に、基本的に juxt と同じ形式をとるが、map を使用する関数を思いつきました。
(defn could-be-lazy-juxt
[& funs]
(fn [& args]
(map apply funs (repeat args))))
=> ((juxt inc dec str) 1)
[2 0 "1"]
=> ((could-be-lazy-juxt inc dec str) 1)
(2 0 "1")
=> ((juxt * / -) 6 2)
[12 3 4]
=> ((could-be-lazy-juxt * / -) 6 2)
(12 3 4)
その怠惰やパフォーマンスについてはほとんど手がかりがありませんが、REPL のタイミングは、何か怠惰なことが起こっていることを示唆しています。
=> (time (apply (juxt + -) (range 1 100)))
"Elapsed time: 0.097198 msecs"
[4950 -4948]
=> (time (apply (could-be-lazy-juxt + -) (range 1 100)))
"Elapsed time: 0.074558 msecs"
(4950 -4948)
=> (time (apply (juxt + -) (range 10000000)))
"Elapsed time: 1019.317913 msecs"
[49999995000000 -49999995000000]
=> (time (apply (could-be-lazy-juxt + -) (range 10000000)))
"Elapsed time: 0.070332 msecs"
(49999995000000 -49999995000000)
この関数は実際にはそれほど高速ではないと確信しています (結果の出力は、どちらも同じくらい長く感じます)。関数で「take x」を実行すると、評価される関数の量が制限されるだけであり、おそらくその適用性が制限され、「take」による他のパラメーターの制限は、通常のjuxtと同じように怠惰になるはずです。
このジャクストは本当に怠け者ですか?レイジー ジャクストは、たとえば他のレイジー関数間の合成ステップなど、テーブルに役立つものをもたらしますか? パフォーマンス (メモリ / CPU / オブジェクト数 / コンパイル) への影響は何ですか? Clojure juxt が reduce で実装されてベクトルを返すのはなぜですか?