0

我正在尝试使用 DrRacket 比较方案中两个不同列表中的元素。如果 m1 小于 m2,我需要返回 true。否则,返回假。我收到以下错误:

<:合同违约预期:真实?给定:(3)参数位置:第一个其他参数......:

将不胜感激任何指导。

谢谢!

#lang scheme

(define t '( "Apple" 3))
(define t2 '("Orange", 1))


(define compare (lambda (m1 m2)
                (if (<(cdr m1)(cdr m2)) #t #f)
                  ))

(compare t t2)
4

1 回答 1

1

像这样的cdr列表("Apple" 3)的 不是3,但是,正如错误消息告诉您的那样,一个具有单个元素的列表(3): 。您无法将列表与函数进行比较<,这表明违反了合同。

图形化:

m1 --> [A|Y]
        | |-----> [A|Y]
     car|  cdr     | |-------> NIL
        V       car|   cdr
      "Apple"      V
                   3

因此:

(car m1) ;; "Apple"
(cdr m1) ;; (3)
(car (cdr m1)) ;; 3

(car (cdr m1))也可以缩短为(cadr m1). 尽管请注意,使用first代替carrest代替cdr(如果所选语言允许)可能会更好。

还有不要写

(if (some-test) #t #f)

some-test已经返回真或假时,只需写

(some-test)
于 2016-03-31T22:54:27.257 回答