首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案:当试图比较两个列表中的元素时,“违反合同”

方案:当试图比较两个列表中的元素时,“违反合同”
EN

Stack Overflow用户
提问于 2016-03-31 22:46:05
回答 1查看 1.1K关注 0票数 0

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

<:合同违约预期:真实?给予:(3)论点立场:第一,其他论点.:

如果能提供任何指导的话。

谢谢!

代码语言:javascript
复制
#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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-31 22:54:27

("Apple" 3)这样的列表的("Apple" 3)不是3,但正如错误消息告诉您的那样,它是一个具有单个元素的 list (3)。您不能将列表与函数<进行比较,因为它指示违反合同的行为。

图形化:

代码语言:javascript
复制
m1 --> [A|Y]
        | |-----> [A|Y]
     car|  cdr     | |-------> NIL
        V       car|   cdr
      "Apple"      V
                   3

因此:

代码语言:javascript
复制
(car m1) ;; "Apple"
(cdr m1) ;; (3)
(car (cdr m1)) ;; 3

(car (cdr m1))也可缩短为(cadr m1)。但是请注意,最好使用first而不是carrest来代替cdr (如果所选的语言允许的话)。

还有,不要写

代码语言:javascript
复制
(if (some-test) #t #f)

some-test已经返回true或false时,只需编写

代码语言:javascript
复制
(some-test)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36345107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档