2016-10-28 15 views
-1

2つのリストの交差を得るためのコードがあります。しかし、私はリストからすべての重複を削除したい。私は関数remove-duplicates()を使用します。私が使用するたびに、drRacketは次のエラーを出します。スキーム内の交差リストから重複を削除する

アプリケーション:手順ではありません。 (abccd) 引数...: は、引数に適用することができ手続き 与えられた期待[なし]ここ

がある私のコードを

#lang scheme 
(define (intersect lst1 lst2) 
    (removedup(lst1 lst2)) 
    (cond 
     ((null? lst1)(quote())) 
     ((isin? (car lst1) lst2) 
     (cons (car lst1) 
      (intersect (cdr lst1) lst2))) 
     (else (intersect (cdr lst1) lst2)))) 

(define (removedup lst1 lst2) 
    (remove-duplicates(lst1)) 
    (remove-duplicates(lst2)) 
) 

(define (isin? a lat) 
    (cond 
     ((null? lat) #f) 
     (else (or (equal? (car lat) a) 
       (isin? a (cdr lat)))))) 

私の入力は> (intersect '(a b c c d) '(c d e f))

です誰も私の問題を解決するのを助けることができますか? ありがとうございます

答えて

5

あなたは別の言語からラケットに来ているようです。ラケットとスキームでは、余分なカッコを追加することはできません。括弧の各ペアは特定の意味を持ちます。で、重複を削除するLST1の呼び出し、その後、電話を:あなたはこれらの最初の2つの関数呼び出した

(remove-duplicates lst1) 

を書くことを意味したときに、このケースでは、

(remove-duplicates(lst1)) 

を書かれています結果。 lst1は関数ではないので、最初のものは成功できません。

さらに、DrRacketが提供するピンクのハイライトを見てみましょう。それはおそらく問題の領域を強調しているでしょう。

また、このバグを修正すると、非常によく似たものが表示されることに注意してください。次の行にありますか?

+0

ありがとうございます!エラーを取り除くために管理されます。しかし、私はまだ私が望む結果を得ることはできません。私の入力は>(交差する '(a b c c d)'(c d e f))です。私の出力は、(c c d)です。私は自分の出力を(c d)にしたい。 – LvanRooij

+1

@LvanRooij Racketは関数型プログラミング言語であり、ほとんどの関数は可能な限り純粋です。 'remove-duplicates'は引数を変更しません(実際にはリストはRacketでは不変です)、単に重複を削除した新しいリストを返します。戻り値を 'remove-duplicates'でラップし、副作用のために呼び出さないようにしてください。 –

+0

テストケースが重要です。また、関数の評価方法がわからない場合は、ステッパーを使って直観を構築してみてください。プログラマになるには、何が起こっているかについての仮説を立て、それをテストする必要があります。 –

関連する問題