我正在使用 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。为什么评估 -
和 /
会抛出错误?
这部分是 Scheme 定义还是 GNU/MIT Scheme 中的实现细节?
最佳答案
这背后的原因是 +
和 *
有标识元素
1 * x = x * 1 = x
0 + x = x + 0 = x
虽然 -
和 /
具有正确的身份,但作为左结合运算符,这否定了(双关语!)它们的值(value)。将可变参数加号视为数字列表的折叠是有意义的,因为从数学上讲,您无法将其与将它们一一相加区分开来。此外,空列表的折叠只是种子元素,即标识。
然而,由于 -
和 /
缺少标识元素,因此没有合理的默认值返回。
它是 R5RS 的一部分
关于scheme - 为什么 + 和 * 分别计算为 0 和 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662918/