【问题标题】:n arity zip function in scheme (problems with apply and map)方案中的 n arity zip 函数(应用和映射问题)
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 感谢您的提醒。我会读一读——我实际上是在通过 Haskell 前奏来实现一些功能,因为我发现必须自己解决它(不管它可能多么令人气愤)迫使我多想——我会太受诱惑了复制粘贴!!!顺便说一句,很棒的网站! -- 我之前提交过一些意见。
【解决方案2】:
(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))

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

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

你在一个很好的轨道上

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

但这并没有利用之前看到的特殊行为。 xs)) args) 中的那个 xs 所在的位置,就是您希望看到 first-xs second-xs ... last-xs) 的地方,并且在所有可能的情况下实际上都需要一个宏

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

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2014-05-07
    • 2017-09-23
    相关资源
    最近更新 更多