方案:"Contract Violation" 尝试比较两个列表的元素时

Scheme: "Contract Violation" when trying to compare elements of two lists

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

<: contract violation expected: real? given: (3) argument position: 1st other arguments...:

非常感谢任何指导。

谢谢!

#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)

("Apple" 3) 这样的列表的 cdr 不是 3,而是错误消息告诉您的 list单个元素:(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已经returns是真还是假,就写

(some-test)