2011-04-25 2 views
0

중첩 목록 구조가 임의 길이이며 깊이는 3입니다. 첫 번째 레벨은 두 번째 레벨과 마찬가지로 임의 길이를 갖지만 세 번째 레벨은 전체 길이에 걸쳐 일정한 길이를 갖습니다. 상기 구조의 예는 '(((A B) (C D)) ((E F) (G H)) ((I J))) 일 것이다.중첩 목록에서 작동

을 가로 질러에 다른 기능을 적용하는 함수를 작성하려고합니다. (

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

를 산출하지만리스트의 세 번째 단계는 더 많은 요소를 포함하는 것을 상상

f A C = AC, f B D = BD, f E G = EG, f F H = FH, f I = I, f J = J : 예시적인 구조에 걸친 함수 맵핑의 예는이 순서로 될 최종 버전에서 약 32,000 개).

본질적으로 내가하려는 것은 하스켈에서 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)))) 
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))) 
관련 문제