scheme中的n arity zip函数(应用和映射问题)
我无法通过列表列表调用mapscheme中的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)'
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)))))