在嵌套列表上运行

时间:2011-04-25 19:53:31

标签: scheme racket nested-lists

我有一个任意长度的嵌套列表结构,深度为3。第一级别具有任意长度,第二级别也是如此,但第三级别保证在整个事物中具有统一的长度。所述结构的一个例子是'(((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 个答案:

答案 0 :(得分: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))))

答案 1 :(得分:1)

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