gpt4 book ai didi

functional-programming - 方案中的 eq?、eqv?、equal? 和 = 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 05:22:27 35 4
gpt4 key购买 nike

我想知道Scheme中的这些操作有什么区别。我在 Stack Overflow 上看到过类似的问题,但它们是关于 Lisp 的,并且没有对其中三个运算符进行比较。

我正在Scheme中编写不同类型的命令,并得到以下输出:

(eq? 5 5) -->#t
(eq? 2.5 2.5) -->#f
(equal? 2.5 2.5) --> #t
(= 2.5 2.5) --> #t

为什么会这样?

最佳答案

我将逐步回答这个问题。让我们从 = 等价谓词开始。 = 谓词用于检查两个数字是否相等。如果您提供除数字之外的任何其他内容,则会引发错误:

(= 2 3)     => #f
(= 2.5 2.5) => #t
(= '() '()) => error

eq? 谓词用于检查其两个参数是否代表内存中的同一个对象。例如:

(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t

但是请注意,内存中只有一个空列表'()(实际上内存中并不存在空列表,而是一个指向内存位置0的指针)被视为空列表)。因此,在比较空列表时 eq? 将始终返回 #t (因为它们代表内存中的同一对象):

(define x '())
(define y '())
(eq? x y) => #t

现在,根据实现的不同,eq? 可能会或可能不会返回数字、字符串等原始值的 #t。例如:

(eq? 2 2)     => depends upon the implementation
(eq? "a" "a") => depends upon the implementation

这就是 eqv? 谓词发挥作用的地方。 eqv?eq? 谓词完全相同,只是它总是为相同的原始值返回 #t。例如:

(eqv? 2 2)     => #t
(eqv? "a" "a") => depends upon the implementation

因此 eqv?eq? 的超集,在大多数情况下,您应该使用 eqv? 而不是 eq?.

最后我们来到equal?谓词。 equal? 谓词与 eqv? 谓词完全相同,只不过它也可以用来测试两个列表、向量等是否具有满足条件的对应元素eqv? 谓词。例如:

(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f

一般来说:

  1. 当您希望测试两个数字是否相等时,请使用 = 谓词。
  2. 当您希望测试两个非数字值是否相等时,请使用 eqv? 谓词。
  3. 当您希望测试两个列表、向量等是否相等时,请使用 equal? 谓词。
  4. 不要使用 eq? 谓词,除非您确切知道自己在做什么。

关于functional-programming - 方案中的 eq?、eqv?、equal? 和 = 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16299246/

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