2011-04-25 45 views
0

我有一個任意長度的嵌套列表結構,深度爲三。第一層的長度與第二層相同,但是第三層的長度在整個事物中保證具有統一的長度。所述結構的一個例子是'(((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中表達爲​​。我知道我需要類似(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)))) 
1

這將是更容易定義f爲發生在值列表的功能。如果沒有,那麼最後的表格很容易添加apply,但它並沒有讓它變得更好。 (使用休止參數意味着語言無論如何將不得不創建這些列表。)

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