Работа с вложенными списками - PullRequest
0 голосов
/ 25 апреля 2011

У меня есть структура вложенного списка произвольной длины с глубиной три.Первый уровень имеет произвольную длину, как и второй уровень, но третий уровень гарантированно будет иметь одинаковую длину по всему объекту.Примером такой структуры может быть '(((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 ...))), чтобы получить первую часть первого раздела, но после этого я действительно потерял здесь логику.Извините, если это действительно запутанный, плохо объясненный вопрос.Я просто действительно потерян.

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

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Было бы намного проще определить 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)))
1 голос
/ 26 апреля 2011
(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))))
...