我的“lisp-pl语言”抛出错误

时间:2013-06-06 13:14:01

标签: lisp

干杯!!!我有一个关于函数契约的问题,我需要用pl语言(一个lisp贡献)写合同假设有一个(类型A的列表)(类型b的列表)并返回一个列表列表(类型AB)同时 。这是我到目前为止所得到的,但它不起作用:

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

可能最简单的方法就是使用映射。 [由于您使用的是define,我假设您正在使用Scheme]。

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