Clojure 为什么+;(或*)与零参数的-(或/)行为不同?

Clojure 为什么+;(或*)与零参数的-(或/)行为不同?,clojure,Clojure,当您使用零参数调用+时 user=> (+) 0 我得到0,因为它是+的不变元素。它的工作原理与* user=> (*) 1 为什么这对-和/不起作用 user=> (-) ArityException Wrong number of args (0) passed to: core/- clojure.lang.AFn.throwArity (AFn.java:429) user=> (/) ArityException Wrong number of args

当您使用零参数调用+

user=> (+)
0
我得到0,因为它是+的不变元素。它的工作原理与*

user=> (*)
1
为什么这对-/不起作用

user=> (-)
ArityException Wrong number of args (0) passed to: core/-  clojure.lang.AFn.throwArity (AFn.java:429)

user=> (/)
ArityException Wrong number of args (0) passed to: core//  clojure.lang.AFn.throwArity (AFn.java:429)

技术解释是:

如果选中
(source*)
(source+)
(source-)

您将看到
*
+
可以接受0个参数,而
-
函数不能接受

(defn -
 ([x] (. clojure.lang.Numbers (minus x)))
 ([x y] (. clojure.lang.Numbers (minus x y)))
 ([x y & more]
   (reduce1 - (- x y) more)))

请注意,
-
/
在给定单个参数时工作方式不同:
(-x 0)
(-x)
不同。
(/x1)
(/x)
也一样。
+
*
的实际论点是,当您的论点可能事先未知时,您可以在列表(可能为空)上应用
减少
。对于除法和否定,情况并非如此,因为你很少需要:

(apply / list)
您至少有一个参数:

#(apply / (cons % list))

这不是权威性的,只是猜测。

我猜这种行为的原因是使用了聚合函数的
+
*
:这允许在数学公式中转义大量样板代码。注意以下几点:

(reduce + ()) => 0
(reduce * ()) => 1
(product []) => (* 10 20 1)
选择的值不会影响同质函数的整体结果。假设你必须找到10、20以及某个集合中的所有项目的产品。你就是这么做的:

(defn product [items]
  (* 10 20 (reduce * items)))
因此,当coll中有一些项目时,它将完全可以预测:

(product [1 2 3]) => (* 10 20 (* 1 2 3))
当coll为空时,您会得到以下结果:

(reduce + ()) => 0
(reduce * ()) => 1
(product []) => (* 10 20 1)
所以这正是你所期望的

+

那么为什么它不适用于
-
/
? 我想说,它们不是聚合函数,传统上它们与聚合相反。数学中有
+
的运算符∑ ) 和
*
(∏ ), 对于
-
/


再一次,这只是一个猜测。也许有一些更深层的原因。

我尝试用:lisp why+和-work differenting和:clojure why+和-work differenting用谷歌搜索出来。
+
*
。如果它起作用,它将在也一致。在不一致和不一致之间进行选择。@D-side
0
1
分别是
-
/
的正确标识,而不是左标识。例如,请参见。1+您讲的内容与我写的(或想写的)相同是的,你是对的。我可能应该更仔细地阅读现有的答案。