2013-12-18 70 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) ? –

相關問題