2013-06-06 3 views
0

Cheers !!! у меня есть вопрос о контракте функции, который мне нужно записать на языке pl (вклад в lisp), который, как предполагается, должен иметь контракт (список типа A) (список типа b) и вернуть список списков (тип AB) одновременно. это то, что я получил до сих пор, но он не работает:мой «lisp-pl язык» бросает ошибки

(: zip2 : (All (A B) (Listof A) (Listof B) -> (Listof (list A B)))) 
(define (zip2 listA listB) 
    (cond [(null? listA) (list (null null))] 
     [else (list ((car listA) (car listB)))]) 
    (zip2 ((rest listA) (rest listB)))) 

(equal? (list (list 1 'a) (list 2 'b) (list 3 'c)) (zip2 (list 1 2 3) (list 'a 'b 'c))) 

ответ

1
(define (zip2 listA listB) 
(cond [(null? listA) null] 
     [else (cons (list (car listA) (car listB)) 
        (zip2 (rest listA) (rest listB)))])) 
+0

Спасибо всем !!!! – lnotik

1

Наверное, самый простой подход просто использовать отображение. [Поскольку вы используете define, я предположим, что вы используете схему].

(define (zip A B) (map list A B)) 

Если вы не можете использовать map, то здесь хвост-рекурсивный алгоритм:

(define (zip A B) 
    (let zipping ((a A) (b B) (rslt '()) 
    (if (or (null? a) (null? b)) 
     (reverse rslt) 
     (zipping (cdr a) (cdr b) 
       (cons (list (car a) (car b)) rslt))))) 
Смежные вопросы