为什么在这种情况下,andmap返回#t?

用户名

我正在使用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功能使用。andor运营商不能使用apply,因为它们是短路,并且因此被实现为宏,而不是功能,而是andmapormap实现该功能来代替。


如果该论点似乎不足以使您满意,您还可以在其简单的英语定义中考虑这些内容,以得出相同的结论。andmap操作什么意思好吧,它问了一个问题:“此列表中的所有元素都满足谓词吗?” 在空列表上,答案将始终是yes,因为您不可能为该声明提供反例。

相反,ormap对偶是:“此列表中的至少一个元素满足谓词吗?” 答案将永远是“否”,因为根本不可能产生任何元素,因此,确定满足谓词的元素肯定是不可能的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在这种情况下,为什么 GetExternalLoginInfoAsync() 返回 null?

为什么在这种情况下UniquelyReferencedNonObjC返回false?

为什么在这种情况下isinstance()返回False?

在这种情况下,为什么“ std :: begin()”总是返回“ const_iterator”?

为什么在这种情况下catch不返回错误?

为什么在这种情况下Image.IO.read()返回null?

为什么在这种情况下html方法返回未定义?

为什么在这种情况下bool和not bool都返回true?

为什么在这种情况下StringBuilder.Equals返回“ true”?

为什么在这种情况下 find 函数返回 NIL?

为什么在这种情况下.fetchall()方法返回空列表?

为什么在这种情况下算术运算会返回NaN?

在这种情况下,编译器为什么不能限制返回类型

为什么 ctree 在这种情况下只返回一个终端节点?

为什么 Panda 在这种情况下会返回 ValueError ?

关于为什么 lastIndexOf() 在这种情况下返回 -1 的非常简单的问题

为什么在这种情况下需要引用/借用?

为什么在这种情况下转发参考无效?

为什么在这种情况下Array的元素是可选的?

为什么std :: forward在这种情况下无用

为什么在这种情况下会有UnboundLocalError?

为什么在这种情况下x = 44?

为什么在这种情况下创建循环?

在这种情况下,为什么Python比C ++快?

为什么在这种情况下引用模板参数?

为什么在这种情况下使用BufferedReader?

为什么在这种情况下“ this”是全局/窗口对象?

为什么在这种情况下fzf失败

为什么在这种情况下无法合并接口?