我在用球拍和博士球拍。
有一个名为andmap的内置函数。
andmap的内置版本是这样工作的:

> (andmap positive? '(1 2 3))

#t

函数编号通常用作:
(number? 3)
> #t

(number? '())
>#f

我不明白为什么会这样:
(andmap number? '())

> #t

我认为结果应该是假的。
文件上说:
*If the lsts are empty, then #t is returned.*

那到底是为什么我看不出来我对语言的设计选择很好奇,特别是新语言,比如球拍。

最佳答案

(andmap pred '())返回#t的原因与(and)返回#t的原因完全相同……但这也许不是最有用的解释,不是吗?真正的答案是#t是逻辑的恒等式,就像0是加法恒等式,1是乘法恒等式一样:

> (+)
0
> (*)
1
> (and)
#t
> (or)
#f

这里的想法是,当与任何给定的输入组合时,标识不会改变输出例如,就像(+ 0 x)总是x并且(* 1 x)总是x(and #t x)总是x并且(or #f x)总是x。这是一个有用的属性,因为它与Scheme中列表的惯用求和方式很好地配合,(apply + lst)
> (apply + '(1 2 3))
6
> (apply + '())
0

类似地,可以使用(apply * lst)而不是单独的product函数andor运算符不能与apply一起使用,因为它们是短路的,因此被实现为宏而不是函数,但是andmapormap却实现了该功能。
如果你觉得这个论点不够令人满意,你也可以用它们的简单英语定义来思考这些问题,得出同样的结论手术是什么意思好吧,它会问一个问题:“这个列表中的所有元素都满足谓词吗?“在一个空名单上,答案总是肯定的,因为你不可能提出一个反例。
相反,andmap是dual:“这个列表中至少有一个元素满足谓词吗?“答案永远是否定的,因为根本不可能产生任何元素,所以产生满足谓词的元素肯定是不可能的。

关于lisp - 为什么在这种情况下,andmap返回#t?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40496494/

10-12 03:28