我正在编写一个自定义传感器作为练习,但我很惊讶地看到它的0-arity init函数没有被调用。
为什么?
它与我使用的聚合函数有关吗?如果是,哪些会调用init函数,为什么不调用其他函数?
(defn inc-xf [xf]
"inc-xf should be equivalent to (map inc)"
(fn
;; init
([]
(println "init") ;; <- this is not called (???)
(xf))
;; step
([result input]
(println "step" result input)
(xf result (inc input)))
;; completion
([result]
(println "completion" result)
(xf result))))
(transduce inc-xf
+
100
[5 5 5])
答案 0 :(得分:5)
如果你看一下transduce
的实现,你可以看到会发生什么。
(defn transduce
;; To get the init value, (f) is used instead of ((xform f))
([xform f coll] (transduce xform f (f) coll))
([xform f init coll]
,,,))
然而,为什么更难回答。
实现零度的传感器是传感器requirements的一部分,但它实际上从未在clojure.core中的任何传感环境中使用。在邮件列表上有post提出与您相同的问题,以及transduce
实际使用init arity的sudo pacman -S jdk8-openjdk
实现。但是,proposal被拒绝了解释:
Rich要求我拒绝这张票,因为xform的初始值不应该参与减少函数的累积。 - 亚历克斯米勒
如果传感器没有在任何地方使用,为什么它是传感器合同的初始部分? ¯\ _(ツ)_ /¯