2016-03-31 35 views
0

DrRacketを使用して、scheme内の2つの異なるリストの要素を比較しようとしています。 m1がm2より小さい場合はtrueを返す必要があります。それ以外の場合はfalseを返します。次のエラーが表示されます。スキーム:2つのリストの要素を比較しようとするときの「契約違反」

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

ガイダンスを参考にしてください。

ありがとうございます!エラーメッセージがわかりますよう("Apple" 3)ようなリストのcdr

#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

は、単一の要素を持つリスト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)に短縮することができます。 cdrの代わりにcarrestの代わりにfirstを使用する方がよいでしょうが、注意してください。 some-testが既にだけ多くの意味を作って、完全に私の問題を解決し

(some-test) 
+0

を書き、trueまたはfalseを返すとき

また、

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

を書いていません。ありがとう! – user2411290

関連する問題