【问题标题】:Usage of Procedure and Map in SchemeScheme中procedure和map的使用
【发布时间】:2011-03-24 16:25:01
【问题描述】:

我对 Scheme 很陌生,我正在慢慢找到解决办法。

对Procedures和Map有一些疑惑,希望能得到解答。

(map plus1 (list 1 2 3 4))

基本上会给我返回结果:

(2 3 4 5)

如果该过程将列表作为其唯一参数,那很好。我的问题是我如何才能使用像这样的过程,它需要带有 Map 的 2 个参数?

(define plus(m list)
    (+ m list))

提前感谢您的帮助和建议。

【问题讨论】:

  • 如果你想要什么更清楚,回答这个问题会更容易。您是想为每次调用消耗列表的两个成员,消耗两个列表的一个成员,还是消耗一个列表的一个成员而其他参数为静态?

标签: list scheme racket


【解决方案1】:
(define (plus m xs)
  (map (lambda (x) (+ m x)) xs))

(define (adder m)
  (lambda (x) (+ m x)))

(define plus (m xs)
  (map (adder m) xs))

这允许您将adder 函数也用于其他事情。

【讨论】:

  • 你不应该破坏list。 Scheme 只有一个用于函数和其他值的命名空间。
  • @Svante: a) 它是一个局部变量,所以我破坏的只是 plus 方法的局部范围。 b) 我只是使用了 Darran 使用的名称。不过没关系,我改了。
  • 好吧,我会闭嘴说我最讨厌的事:一个小写的 l 作为参数看起来像 1。没关系,别说了。
  • @Jason:没关系,我很高兴更改我的变量名以响应 cmets。如果不包容,我什么都不是。
  • 这正是我想要的。谢谢!就我理解的,就是创建一个函数来调用Map方法,然后定义一个匿名函数来做加法?
【解决方案2】:

可能是这样的?

(define (plus m n) (+ m n))

(map plus (list 1 2 3) (list 4 5 6))

; => (list 5 7 9)

【讨论】:

    【解决方案3】:

    使用两个列表。看看会发生什么:

    guile> (map (lambda (x y) (+ x y)) '(1 2 3) '(4 5 6))
    (5 7 9)
    

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多