方案中的n arity zip函数(apply和map的问题)

时间:2013-06-07 10:32:34

标签: scheme apply map-function gambit

我无法在列表列表上调用地图。

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函数的相同args呢?

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)))

这是第一次尝试。 我确信(......希望)我在这里错过了一些小事。

2 个答案:

答案 0 :(得分:3)

zip功能位于我的Standard Prelude

> (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))

答案 1 :(得分:1)

(define (zip . xs)  
 (if (null? (car xs))
      '()
      (cons (map car xs)
            (apply zip (map cdr xs)))))

(zip'(1 2)'(3 4)'(5 6))

;值13:((1 3 5)(2 4 6))

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

他们重新介绍行为的方法是使用apply,但你不能直接应用map,并且在匿名函数中正确包装它很难。

你和

走得很好

(define(zip.args)   (apply(lambda xs(map(lambda ys foldr cons'()ys)xs))args))

但这并没有利用之前看到的特殊行为。 在xs))args)的xs,你想要看到first-xs second-xs ... last-xs的地方,并且在所有可能的情况下实际上这样做需要一个宏

你最好直接在多地图方法上实现逻辑。