没有调用传感器的init

时间:2018-02-18 05:48:22

标签: clojure transducer

我正在编写一个自定义传感器作为练习,但我很惊讶地看到它的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])

1 个答案:

答案 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的初始值不应该参与减少函数的累积。    - 亚历克斯米勒

如果传感器没有在任何地方使用,为什么它是传感器合同的初始部分? ¯\ _(ツ)_ /¯