#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)))