Как написать распаковать с помощью карты?

Я читаю книгу Язык программирования Scheme. Я пытаюсь выполнить упражнение 2.8.7:

Используйте карту для определения процедуры транспонирования, которая принимает список пар и возвращает пару списков следующим образом.

(транспонировать '((a . 1) (b . 2) (c . 3))) ;;=> ((a b c) 1 2 3)

[Подсказка: ((a b c) 1 2 3) совпадает с ((a b c) . (1 2 3)).]

Я узнал, что (map list '(a 1) '(b 2) '(c 3)) дает мне '((a b c) (1 2 3)). Думаю, я мог бы решить это упражнение, написав кучу шаблонов для превращения '((a . 1) (b . 2) (c . 3)) в (map list '(a 1) '(b 2) '(c 3)) и '((a b c) (1 2 3)) в ((a b c) 1 2 3). Однако я уверен, что смысл упражнения не в этом.

Может кто-нибудь помочь мне здесь? Есть ли очевидный способ сделать это с помощью карты, которую мне не хватает?


person Rafael Almeida    schedule 03.08.2012    source источник


Ответы (1)


да. Очевидное решение включает в себя вызов map дважды, а затем consобъединение двух результатов.

person Chris Jester-Young    schedule 03.08.2012
comment
Я понимаю! (define (transpose ziped) (cons (map car ziped) (map cdr ziped))). Я думаю, это не самый эффективный способ сделать это, но, вероятно, это то, что было задумано. Спасибо! - person Rafael Almeida; 03.08.2012