我正在使用Racket和Drack。
有一个称为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.*
为什么这在地球上有意义?我没看到。我对语言的设计选择感到好奇,特别是诸如Racket之类的新语言。
理由(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
操作是什么意思?好吧,它问了一个问题:“此列表中的所有元素都满足谓词吗?” 在空列表上,答案将始终是yes,因为您不可能为该声明提供反例。
相反,ormap
对偶是:“此列表中的至少一个元素满足谓词吗?” 答案将永远是“否”,因为根本不可能产生任何元素,因此,确定满足谓词的元素肯定是不可能的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句