0

深さ3の任意の長さのネストされたリスト構造があります。第1レベルは、第2レベルと同様に任意の長さですが、第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))

しかし、リストの3番目のレベルにさらに多くの要素が含まれていると想像してください(たとえば、最終バージョンでは約32,000)。

基本的に、私がやろうとしていることは、Haskellではのようなものとして表現されますf . transpose。最初のセクションの最初の部分を取得するようなものが必要なことはわかっています(map car (map flatten (car ...)))が、その後、ここのロジックに本当に迷いました。これが本当に複雑で、説明が不十分な質問である場合は、申し訳ありません。私は本当に迷っています。

この方法で構造全体に関数を適用するにはどうすればよいですか?

4

2 に答える 2

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))))
于 2011-04-25T20:07:13.683 に答える
1

fyourを値のリストを受け取る関数として定義する方がはるかに簡単です。そうでない場合、最後の形式は簡単に追加でき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)))
于 2011-04-25T20:20:15.393 に答える