将列表的元素配对在一起

Pairing elements of lists together

我正在 Scheme 中创建一个名为 pair-elements 的函数,其规格如下。它需要一个包含多个子列表的列表,每个子列表必须只有两个元素(虽然我现在不检查这个)。它 returns 一个包含两个子列表的列表,一个包含每个给定子列表的第一个元素,另一个包含它们的第二个元素。这是它应该做什么的示例:

>(对元素'((a b)(c d)(e f)))
((a c e) (b d f))

这是我目前所拥有的。我已经能够使用此代码成功创建第一个子列表:

(define (pair-elements x)
    (if (null? x)
    null
    (cons (caar x) (pair-elements (cdr x)))))

经过测试,结果如下:
>(对元素'((a b)(c d)(e f)))
(a c e)

这是朝着正确方向迈出的一步,但我不知道如何完成第二部分并将它们都放入列表中。我所有的尝试都导致了非常丑陋的输出。例如,我的一次尝试:

(cons (cons (caar x) (pair-elements (cdr x))) (cons (cdar x) (pair-elements (cdr x))))))

获取输出 ((a (c (e) (f)) (d) (e) (f)) (b) (c (e) (f)) (d) (e) (f )), 这显然有偏差。

谁能帮我完成这个功能?我是 Scheme 的新手,我绝对需要知道如何做这样的事情。制作子列表列表是我特别费劲的事情。

您的实施基本上是重新发明轮子 - 如果您使用内置过程 map,这将容易得多,它可以满足您的需求;您只需将要应用于输入列表的每个元素的过程作为参数传递(在本例中为 firstsecond):

(define (pair-elements lst)
  (list                 ; create a new list with the two sublists
   (map first lst)      ; sublist of first elements of input list
   (map second lst)))   ; sublist of second elements of input list

我们可以更进一步,利用 map 可以接收多个列表作为输入的事实:

(define (pair-elements lst) ; process input list element-wise on each
  (apply map list lst))     ; sublist and create a list with them

无论哪种方式,它都按预期工作:

(pair-elements '((a b) (c d) (e f)))
=> '((a c e) (b d f))