1

投稿は初めてで、スキームに疑問があります。次のようなパラメータを入力するときに、両方の引数として渡された要素のすべての出現箇所をリストから削除する必要があります。

]=> (rmobject '(1 2 3 5 0 2 3 5 3) 3)

エラーが発生しました:

The object (3 5 3 2 3 6 3) is not applicable

2番目のラムダが原因だと思いますが、正しく機能していませんが、なぜですか?

(define (rmobject list1 obj)
  (if (null? list1)
      '() 
       (if (= obj (car list1))
           ((lambda (list1) (cdr list1)) list1)
           ((lambda (list1) (list1)) list1)))
        (cons (car list1) (rmobject (cdr list1) obj)))

私はコードを書き直しました、そしてこれは要素を取り除くことで正しく働きます、しかし適切はそうではありません、そして両方とも同じであると仮定します。前もって感謝します

(define (rmobject list1 obj)
  (if (null? list1)
     '() 
  (if (= obj (car list1))
      (rmobject (cdr list1) obj)
      (cons (car list1) (rmobject (cdr list1) obj)))))
4

2 に答える 2

2

コードの最初のバージョンはあまり意味がありません。なぜlambdaこのようにsを使用するのですか?定義されているのと同じプロシージャを再帰的に呼び出すことになっています。ワンショットの匿名プロシージャを作成するのではなく、目前の問題を解決するためには機能しません。そして、この部分は:(list1)エラーを引き起こしていますThe object is not applicable:あなたはそれがプロシージャであるかのようにリストを呼び出そうとしています-それは括弧で囲まれているからです。Schemeでは、次のような構文は、プロシージャが呼び出される(foo)ことを示していることに注意してください。foo

コードの2番目のバージョンは問題ありません。これは、remove-allプロシージャを実装する簡単な方法です。ただし、ちょっとした気まぐれです。sをネストしていることに気付いた場合は、aがより適切ifであるという確かな兆候です。また、の代わりにcond使用することをお勧めします。そうすれば、手順は単なる数値以上のもので機能します。equal?=

(define (rmobject list1 obj)
  (cond ((null? list1)
         '())
        ((equal? obj (car list1))
         (rmobject (cdr list1) obj))
        (else
         (cons (car list1)
               (rmobject (cdr list1) obj)))))

将来の参考のために:実装しているプロシージャは、通常、インタプリタの一部として含まれています。たとえば、Racketには、等式をテストするためのデフォルトの手順としてremove*使用するがあります。equal?

(define (rmobject list1 obj)
  (remove* (list obj) list1))

filterまた、 @Maxwellの回答のように使用できます。それを書く別の方法:

(define (rmobject list1 obj)
  (filter (negate (curry equal? obj)) list1))

とにかく、これは機能します:

(rmobject '(1 2 3 5 0 2 3 5 3) 3)
=> '(1 2 5 0 2 5)
于 2012-11-25T15:05:53.100 に答える
1

問題は、その行((lambda (list1) (list1)) list1)))で引数()を受け入れる関数を作成し、list1それを関数として呼び出そうとすることです。関数には実際には代わりにリストが渡されるため、インタープリターはエラーで終了します。

2回目の試行で発見したように、ラムダを介して関数を作成する必要はなく、思いついたアルゴリズムを使用してコヒーレントでさえありません。それでも、2回目の試行で使用するテクニックよりもはるかに単純なテクニックがたくさんあります。実際にラムダを使用するものを示して、それがどのように機能するかを確認できるようにします。私が言及している代替手法は、filter次のように依存して機能します。

(define (rmobject list1 obj)
  (filter (lambda (x) (not (equal? x obj))) list1))
于 2012-11-25T12:16:21.080 に答える