scheme中的n arity zip函数(应用和映射问题)

scheme中的n arity zip函数(应用和映射问题),scheme,apply,map-function,gambit,Scheme,Apply,Map Function,Gambit,我无法通过列表列表调用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)) 这正是我们想要的,但我无法通过可调用函数实现这一点 编辑--(映射(λx)'(12)'(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))
这正是我们想要的,但我无法通过可调用函数实现这一点

编辑--
(映射(λx)'(12)'(34)'(56))
给出相同的结果

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
如何与map一起使用

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>)
这和第一次尝试是一样的。
我确信(…希望)我在这里遗漏了一些小东西。

zip函数在我的内存中


zip
函数在my中

(12)(34)(56)

);价值13:((135)(246))

正如你所看到的,它并不真正符合地图模式。您前面观察到的行为有点不标准,其中map给定一个函数和多个列表将返回一个列表,该列表是通过将函数应用于列表中的匹配项而创建的

他们重新引入行为的方法是使用apply,但您不能直接应用map,并且很难将其正确地包装到匿名函数中

你和我的关系很好

(定义(zip.args) (应用(lambda xs(map(lambda ys foldr cons’()ys)xs))参数)

但这并没有利用以前看到的特殊行为。 (xs)参数中的xs)所在的位置,是您希望看到第一个xs和第二个xs的位置。。。最后一个xs),而要真正做到这一点,很可能需要一个宏

最好直接在multi-map方法上实现逻辑

(12)(34)(56)

);价值13:((135)(246))

正如你所看到的,它并不真正符合地图模式。您前面观察到的行为有点不标准,其中map给定一个函数和多个列表将返回一个列表,该列表是通过将函数应用于列表中的匹配项而创建的

他们重新引入行为的方法是使用apply,但您不能直接应用map,并且很难将其正确地包装到匿名函数中

你和我的关系很好

(定义(zip.args) (应用(lambda xs(map(lambda ys foldr cons’()ys)xs))参数)

但这并没有利用以前看到的特殊行为。 (xs)参数中的xs)所在的位置,是您希望看到第一个xs和第二个xs的位置。。。最后一个xs),而要真正做到这一点,很可能需要一个宏


您最好直接在multi-map方法上实现逻辑。

谢谢您的提醒。我来读一读-我实际上是在读Haskell的前奏曲,实现了一些函数,因为我发现自己必须自己解决它(无论多么恼火),这迫使我想得更多一点-我太想复制粘贴了!!!顺便说一句,这个网站很棒我之前已经提交了一些意见书。谢谢你的提醒。我来读一读-我实际上是在读Haskell的前奏曲,实现了一些函数,因为我发现自己必须自己解决它(无论多么恼火),这迫使我想得更多一点-我太想复制粘贴了!!!顺便说一句,这个网站很棒我以前曾提交过几份意见书。
(lambda xs(foldr cons'()xs))==(lambda(x)(cons x())==list
,根据
foldr
的定义:)但是您使用的是
(lambda xs foldr cons'()xs)==(lambda xs)
,它是
(lambda x)==list
。因此,您所使用的就是
list
(lambda xs(foldr cons'()xs))==(lambda(x)(cons x())==list
,根据
foldr
的定义:)但是您使用的是
(lambda xs foldr cons'()xs)==(lambda xs)
,它是
(lambda x)==list
。所以您所使用的就是
列表
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)))
> (define (zip . xss) (apply map list xss))
> (zip '(1 2 3) '(a b c))
((1 a) (2 b) (3 c))
> (zip '(1 2 3) '(a b c) '(x y z))
((1 a x) (2 b y) (3 c z))
(define (zip . xs)  
 (if (null? (car xs))
      '()
      (cons (map car xs)
            (apply zip (map cdr xs)))))