リストのリストでマップを呼び出すのに問題があります。
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)))
これは最初の試みとまったく同じです。ここで小さな何かが欠けていると確信しています (...希望)。