Es scheint, dass Scheme Ganzzahl- und Gleitkomma-Versionen einer Reihe hält, anders zu sein, wenn gleich mit ?, aber das gleiche, wenn = mit ihnen vergleichen:rekursive numerische Gleichheit in Schema
(equal? 2 2.0) ; => #f
(= 2 2.0) ; => #t
Allerdings, wenn ich haben Sie eine rekursive Struktur mit einigen numerischen Teilen (oder sogar eine einfache Liste von Zahlen), gibt es eine Methode, um sie zu vergleichen, die = für numerische Vergleiche verwendet?
(equal? '(2 3) '(2.0 3.0)) ; => #f
(= '(2 3) '(2.0 3.0)) ; error: contract violation
Ich kann meine eigene Gleichheit checker, so etwas schreiben:
(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)))))
Aber es scheint, als ob dies eine gemeinsame Aufgabe genug sein würde, das Schema könnte eine eingebaute Methode, dies zu tun.
Ah, das ist eine schöne Lösung für Listen von Zahlen. Es klingt dann wie für komplexere Strukturen, wie '(a 2 (b 3)) vs.' (a 2.0 (b 3.0)), müssen Sie möglicherweise eine benutzerdefinierte Funktion schreiben. –
@ JeffAmes Ich habe in einem Beispiel der Herstellung eines generischen gleich Maker bearbeitet, wo Sie angeben können, wie einige Typen verglichen werden sollen. – Sylwester