Работа с вложенными списками

#scheme #racket #nested-lists

#схема #racket #вложенные списки

Вопрос:

У меня есть структура вложенного списка произвольной длины с глубиной в три. Первый уровень имеет произвольную длину, как и второй уровень, но третий уровень гарантированно будет иметь одинаковую длину по всему объекту. Примером указанной структуры может быть '(((A B) (C D)) ((E F) (G H)) ((I J))) .

Я пытаюсь написать функцию, которая применяла бы другую функцию на разных уровнях структуры (извините, я действительно не знаю, как это сформулировать). Пример отображения функций в структуре примера был бы в таком порядке:

f A C = AC, f B D = BD, f E G = EG, f F H = FH, f I = I, f J = J ,

выдача

'((AC BD) (EG FH) (I J))

но представьте, что третий уровень списка содержит намного больше элементов (скажем, около 32 000 в окончательной версии).

По сути, то, что я пытаюсь сделать, было бы выражено в Haskell примерно так f . transpose . Я знаю, что мне нужно что-то вроде (map car (map flatten (car ...))) , чтобы получить первую часть первого раздела, но после этого я действительно запутался в логике здесь. Прошу прощения, если это действительно запутанный, плохо объясненный вопрос. Я просто действительно потерян.

Как бы я применил функцию во всей структуре таким образом?

Ответ №1:

 (define l '(((A B)
   (C D))
  ((E F)
   (G H))
  ((I J)))
)
(define zip (lambda lists (apply map list lists)))
(define (f values) (list 'f values))

(map (lambda (v) (map (lambda values (apply f values)) (apply zip v))) l)
  

С принтами

 (((f (a c)) (f (b d))) ((f (e g)) (f (f h))) ((f (i)) (f (j))))
  

Ответ №2:

Было бы намного проще определить ваш f как функцию, которая принимает список значений. Если нет, то к последней форме легко добавить apply , но это не делает ее лучше. (Использование аргумента rest означает, что языку в любом случае придется создавать эти списки.)

 #lang racket
(define data '(((A B) (C D)) ((E F) (G H)) ((I J))))
(define (f xs) (string->symbol (string-append* (map symbol->string xs))))
(map (λ (pairs)
       (list (f (map first pairs))
             (f (map second pairs))))
     data)
(map (λ (pairs) (map f (apply map list pairs)))
     data)
(for/list ([pairs (in-list data)])
  (for/list ([xs (in-list (apply map list pairs))])
    (f xs)))