1

スキームでマッチを使用する方法を学ぼうとしています。非常に短い問題 (つまり、長さの定義はわずか 2 行) ではどのように機能するかはある程度理解できますが、複数の入力がある問題やヘルパー プログラムではそうではありません。たとえば、共用体を定義する一般的な方法は次のとおりです。

(define ele? 
  (lambda (ele ls)
   (cond
    [(null? ls) #f]
    [(eq? ele (car ls)) #t]
    [else (ele? ele (cdr ls))])))

(define union
 (lambda (ls1 ls2)
  (cond
   [(null? ls2) ls1]
   [(ele? (car ls2) ls1) (union ls1 (cdr ls2))]
   [else (union (cons (car ls2) ls1) (cdr ls2))])))

両方のプログラムで一致を使用してこれを行うにはどうすればよいですか? (または、2 つのプログラムが必要でしょうか?)

4

1 に答える 1

1

最初のものは次のように実装できます。

(define ele?
  (lambda (a b)
    (let ((isa? (lambda (x) (eq? (car x) a))))
      (match b [(? null?) #f]
               [(? isa?) #t]
               [_ (ele? a (cdr b))]))))

2番目は簡単です

(define uni
  (lambda (ls1 ls2)
    (let ((carinls2? (lambda (x) (ele? (car x) ls1))))
      (match ls2 [(? null?) ls1]
                 [(? carinls2?) (uni ls1 (cdr ls2))]
                 [_ (uni (cons (car ls2) ls1) (cdr ls2))]))))

これらの1つの引数let lambdasを回避するよりスマートな方法があるかもしれませんが、私はまだ学んでいます;)

于 2012-09-06T01:21:13.527 に答える