干杯!!!我有一个关于函数契约的问题,我需要用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)))
答案 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)))))