方案:"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
代替 car
和 rest
代替 cdr
可能更好(如果所选语言允许)。
另外,不要写
(if (some-test) #t #f)
当some-test
已经returns是真还是假,就写
(some-test)
我正在尝试使用 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
代替 car
和 rest
代替 cdr
可能更好(如果所选语言允许)。
另外,不要写
(if (some-test) #t #f)
当some-test
已经returns是真还是假,就写
(some-test)