2012-09-05 1 views
1

J'essaie d'apprendre à utiliser la correspondance dans le schéma. Je comprends en quelque sorte comment cela fonctionne avec des problèmes très courts (par exemple: définir la longueur est juste deux lignes), mais pas avec des problèmes où il y a plus d'une entrée, et les programmes d'aide. Par exemple, voici une façon populaire de définir union:Utilisation de match dans le schéma

(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))]))) 

Comment faites-vous cela en utilisant la correspondance dans les deux programmes? (Ou auriez-vous besoin même deux programmes?)

Répondre

1

le premier pourrait être mis en œuvre comme:

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

puis le second est facile

(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))])))) 

peut-être il y a une façon plus intelligente pour éviter ces un seul argument laisse lambdas mais j'apprends toujours;)

Questions connexes