2

リストのリストでマップを呼び出すのに問題があります。

01>(define (foldr f accum xs)
  (if (null? xs) accum
      (f (car xs) (foldr f accum (cdr xs)))))

02> (map (lambda xs foldr cons '() xs) '(1 2) '(3 4) '(5 6))

((1 3 5) (2 4 6))

これは私たちが望んでいるものですが、これを呼び出し可能な関数から機能させることはできません。

編集 --(map (lambda x x) '(1 2) '(3 4) '(5 6))同じ結果が得られます!

03> (define (zip . xs)
    (map (lambda ys foldr cons '() ys) xs)))

04> (zip '(1 2) '(3 4) '(5 6))

(((1 2)) ((3 4)) ((5 6)))

zip に渡された引数がリストになるという問題はわかりますが、動作バージョンで行ったようにそれらを扱い続けることはわかりません。

applyがマップでどのように使用されているかわかりません

05> (define zip
  (lambda xs
    (apply (map (lambda ys foldr cons '() ys)) xs)))

06> (zip '(1 2) '(3 4) '(5 6))

*** ERROR IN zip, (stdin)@546.12 -- Wrong number of arguments passed to procedure (map '#<procedure #49>)

map は何も呼び出していないため、これは理にかなっています。;; しかし、fold 関数の map 呼び出しと同じ引数に map を適用するにはどうすればよいでしょうか?

07> (define (zip . args)
  (apply (lambda xs (map (lambda ys foldr cons '() ys) xs)) args))

08> (zip '(1 2) '(3 4) '(5 6))

(((1 2)) ((3 4)) ((5 6)))

これは最初の試みとまったく同じです。ここで小さな何かが欠けていると確信しています (...希望)。

4

2 に答える 2

1
(define (zip . xs)  
 (if (null? (car xs))
      '()
      (cons (map car xs)
            (apply zip (map cdr xs)))))

(zip '(1 2) '(3 4) '(5 6))

;値 13: ((1 3 5) (2 4 6))

ご覧のとおり、実際にはマップ パターンに適合していません。前に観察した動作は少し標準的ではありません。関数と複数のリストを指定した map は、リスト内の一致する用語に関数を適用して作成されたリストを返します。

動作を再導入する方法は apply を使用することですが、マップを直接適用することはできず、無名関数で適切にラップすることは困難です。

あなたは良い軌道に乗っていました

(define (zip . args) (apply (lambda xs (map (lambda ys foldr cons '() ys) xs)) args))

しかし、それは以前に見られた特別な動作を活用していません。xs)) args) の xs は、first-xs second-xs ... last-xs) を見たい場所であり、実際にそのように実行するには、おそらくマクロが必要です

マルチマップ メソッドに直接ロジックを実装する方がよいでしょう。

于 2013-06-08T05:10:06.880 に答える