gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:09 25 4
gpt4 key购买 nike

我正在使用 Racket 和 Dr. Racket。

有一个名为 andmap 的内置函数.

andmap 的内置版本是这样工作的:

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

#t

函数号通常作为:

(number? 3)
> #t

(number? '())
>#f

我不明白为什么会这样:

(andmap number? '())

> #t

我觉得结果应该是false。

文档说:

*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 操作是什么意思?好吧,它问了一个问题:“这个列表中的所有元素都满足谓词吗?”在空列表中,答案将始终是,因为您不可能为该声明提供反例。

相比之下,ormap 是对偶的:“此列表中至少有一个元素满足谓词吗?”答案总是,因为根本不可能产生任何元素,所以产生满足谓词的元素肯定是不可能的。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com