【发布时间】:2013-06-07 10:32:34
【问题描述】:
我无法通过列表调用 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)))
这与第一次尝试相同。 我确定(...希望)我在这里遗漏了一些小东西。
【问题讨论】:
-
(lambda xs (foldr cons '() xs)) == (lambda(x)(cons x ())) == list,根据foldr的定义。 :) 但您使用(lambda xs foldr cons '() xs) == (lambda xs xs),即(lambda x x) == list。所以你使用的只是list。
标签: scheme apply map-function gambit