为什么(reduce*[])评估为1?

Den*_*nis 4 clojure

在clojure中,调用reduce *en empty collection返回1.这是非常令人惊讶的.

我在创建阶乘函数时做了这个发现,定义如下:

(defn factorial [n] (reduce * (take-while #(> % 0) (iterate dec n))))
Run Code Online (Sandbox Code Playgroud)

(factorial 0)正确返回1,没有我必须为零编写一个特殊情况.怎么会 ?

jua*_*rro 7

检查代码*+显示这两个函数通过返回操作的标识来实现0-arity大小写.在*代码的情况下(删除了dosctring和元数据):

(defn *
  ([] 1)
  ([x] (cast Number x))
  ([x y] (. clojure.lang.Numbers (multiply x y)))
  ([x y & more]
     (reduce1 * (* x y) more)))
Run Code Online (Sandbox Code Playgroud)

  • 事实上,Clojure是一种开源语言,其中很大一部分是在Clojure中实现的,这非常棒.:) (2认同)
  • 顺便说一句.(\*)产生1的原因是(Z,*,1)形成一个Monoid.一些不错的属性不属于这个事实.在并行化reduce时可以利用它. (2认同)