代码之家  ›  专栏  ›  技术社区  ›  user2411290

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

  •  0
  • user2411290  · 技术社区  · 9 年前

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

    <:预期违约:真实?给定:(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)
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Daniel Jour    9 年前

    这个 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 而不是 car rest 而不是 信用违约恢复 (如果所选语言允许)。

    另外,不要写

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

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

    (some-test)