【发布时间】:2017-09-01 18:50:26
【问题描述】:
Scheme 似乎认为整数和浮点数版本在使用 equal? 时是不同的,但在使用 = 比较它们时是一样的:
(equal? 2 2.0) ; => #f
(= 2 2.0) ; => #t
但是,如果我有一个包含一些数字部分(甚至是简单的数字列表)的递归结构,是否有一种方法可以使用 = 进行数字比较?
(equal? '(2 3) '(2.0 3.0)) ; => #f
(= '(2 3) '(2.0 3.0)) ; error: contract violation
我可以编写自己的相等检查器,如下所示:
(define myequal?
(lambda (x y)
(cond ((and (null? x) (null? y)) #t)
((or (null? x) (null? y)) #f)
((and (pair? x) (pair? y))
(and (myequal? (car x) (car y))
(myequal? (cdr x) (cdr y))))
((or (pair? x) (pair? y)) #f)
((and (number? x) (number? y)) (= x y))
((or (number? x) (number? y)) #f)
(else (equal? x y)))))
但这似乎是一项足够常见的任务,Scheme 可能有一个内置方法来执行此操作。
【问题讨论】:
标签: recursion scheme racket equality r5rs