我在用球拍和博士球拍。
有一个名为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
函数and
和or
运算符不能与apply
一起使用,因为它们是短路的,因此被实现为宏而不是函数,但是andmap
和ormap
却实现了该功能。如果你觉得这个论点不够令人满意,你也可以用它们的简单英语定义来思考这些问题,得出同样的结论手术是什么意思好吧,它会问一个问题:“这个列表中的所有元素都满足谓词吗?“在一个空名单上,答案总是肯定的,因为你不可能提出一个反例。
相反,
andmap
是dual:“这个列表中至少有一个元素满足谓词吗?“答案永远是否定的,因为根本不可能产生任何元素,所以产生满足谓词的元素肯定是不可能的。关于lisp - 为什么在这种情况下,andmap返回#t?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40496494/