Scheme 为什么+;和*分别计算为0和1?
我正在使用GNU/MIT方案: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
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为初始值的左关联折叠。