Scheme 为什么+;和*分别计算为0和1?

Scheme 为什么+;和*分别计算为0和1?,scheme,lisp,Scheme,Lisp,我正在使用GNU/MIT方案: 1 ]=> (+) ;Value: 0 1 ]=> (*) ;Value: 1 1 ]=> (-) ;The procedure #[arity-dispatched-procedure 2] has been called with 0 arguments; it requires at least 1 argument. ;To continue, call RESTART with an option number: ; (RES

我正在使用GNU/MIT方案:

1 ]=> (+)

;Value: 0

1 ]=> (*)

;Value: 1

1 ]=> (-)

;The procedure #[arity-dispatched-procedure 2] has been called with 0 arguments; it requires at least 1 argument.
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.

2 error> (/)

;The procedure #[arity-dispatched-procedure 3] has been called with 0 arguments; it requires at least 1 argument.
;To continue, call RESTART with an option number:
; (RESTART 2) => Return to read-eval-print level 2.
; (RESTART 1) => Return to read-eval-print level 1.
为什么
+
*
分别计算为0和1。为什么评估
-
/
会抛出错误


这是方案定义的一部分,还是GNU/MIT方案中的一个实现细节?

如果您从
+
*
的角度考虑折叠,或
减少
,您将看到它们需要一个种子值或累加器值。对于*,1是有意义的。对于+0是有意义的。因此,您将获得reduce的种子/累加器

这也是规范的一部分。
这背后的原因是
+
*
具有标识元素

1 * x = x * 1 = x
0 + x = x + 0 = x
虽然
-
/
具有右标识,但作为左关联运算符,这会否定(双关语!)它们的值。把一个变量加号看作是一个数字列表的折叠,初始元素是一个恒等式,这是有道理的,因为从数学上讲,你不能把它和一个接一个地加在一起区分开来。此外,折叠空列表只是种子元素,即标识

但是,由于
-
/
缺少标识元素,因此没有正常的默认值可返回


它是除法的一部分,具有正确的标识值,它是
1
。减法只有一个正确的标识:
0
。严格地说,它们并不是“缺少”同一元素@斯卡尔洛佩兹,而是除法和减法都是左联想的,这使得它们不适合于一个复杂的系统中的元素fold@jozefg左关联折叠(foldl)或右关联折叠(foldr)?@JoshuaTaylor因为它们是左关联的,所以您需要左折叠<代码>((3-2)-1-0)@jozefg我的意思是,在回应你的评论时,他们实际上不适合哪种类型的折叠。无论如何,还需要注意的是,这些操作符,即使
-
/
不接受零个参数,它们也接受一个参数,我认为这是一个容易混淆的地方<代码>(-2)=>-2`但是
(-23)=>-1
(/2)=>1/2
但是
(/23)=>2/3
)。这并不奇怪,但实际上有三种情况:0个arg失败,1个arg产生反向,2个或更多arg是以第一个arg为初始值的左关联折叠。