我在列表列表上调用 map 时遇到问题。
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 没有调用任何东西。;; 但是我们如何将 map 应用于 map 调用 fold 函数的相同参数?
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)))
这与第一次尝试相同。我确定(...希望)我在这里遗漏了一些小东西。