在回答中一个问题 https://stackoverflow.com/questions/10044254/is-there-a-reverse-map-function关于一个使用相同参数映射多个函数的函数(A:juxt),我想出了一个基本上采用与 juxt 相同形式的函数,但使用了映射:
(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 一样懒惰。
这真的是懒惰吗?惰性 juxt 是否会给表带来任何有用的东西,例如作为其他惰性函数之间的合成步骤?对性能(内存/CPU/对象计数/编译)有何影响?
为什么 Clojure juxt 使用reduce 实现并返回一个向量,这打破了惰性?
是的,你的 juxt 实现是懒惰的,因为只调用了懒惰的 map 。
如果不实现调用者中的参数(通过使用 apply. 所以我对其进行了一些更改以采用一系列函数:
user> (defn could-be-lazy-juxt
[funs]
(fn [& args]
(map #(apply %1 %2) funs (repeat args))))
#'user/could-be-lazy-juxt
然后定义一个惰性函数序列,在实现时会产生大量输出
user> (defn loud-seq [len] (take len (map #(do (println "produced a function") %) (cycle [inc dec]))))
#'user/loud-seq
然后使用 juxt 从这个惰性函数序列中创建一个函数
user> (def f (could-be-lazy-juxt (loud-seq 50)))
#'user/f
正如您所看到的,该列表仍然是惰性的,当调用结果函数时,它会意识到它是函数列表。
所以我们称它为:
user> (f 1)
(produced a function
produced a function
2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 produced a function
produced a function
0 2 0)
user>
我将这样做的原因留给你;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)