2013-12-18 69 views
6

我使用GNU/MIT计划:为什么+和*分别评估为0和1?

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计划中的实现细节?

+0

https://en.wikipedia.org/wiki/Empty_product https://en.wikipedia.org/wiki/Empty_sum – Wes

回答

9

这背后的原因是,+*有身份的元素

1 * x = x * 1 = x 
0 + x = x + 0 = x 

虽然-/有权身份,但由于左结合运营商这否定(双关语!)自己的价值。考虑一个可变参数作为数字列表的一个折叠是有道理的,因为数学上最初的元素是一个标识,您不能将它与一个一个地添加到一起。此外,对空列表的折叠就是该种子元素,即身份。

但是因为-/缺少标识元素,所以没有标准的默认值返回。

而且它的R5RS

+0

司_has_右标识值,这是一个部分'1'。减法只有一个正确的身份:'0'。因此,严格地说,他们不是“缺乏”的身份元素 –

+2

@ÓscarLópez但是分割和减法是左联合的,使得它们不适合折叠元素 – jozefg

+0

@jozefg左联合(foldl)或右联合fold(foldr) ? –

相关问题