【问题标题】:Lists as arguments in Scheme列表作为 Scheme 中的参数
【发布时间】:2011-02-26 12:08:06
【问题描述】:

假设我有一个过程 foo,它接受三个参数,并返回一个列表,它们全部加倍:

(define  (foo a b c)
  (list (* 2 a ) (* 2 b) (* 2 c)))

我想做的是创建另一个接受列表的过程,并使用列表元素作为参数调用 foo,如下所示:

(define (fooInterface myList)
  ...)

(fooInterface (list 1 2 3))

问题是,我不想写 fooInterface 假设 foo 总是有 3 个参数。也就是说,如果我向 foo 添加一个额外的参数,只要传入的列表有 3 个元素,fooInterface 应该仍然有效。

【问题讨论】:

  • (map (lambda (x) (* 2 x)) thatList)?
  • @KennyTM:是的,这将为该示例提供相同的最终输出。然而,我试图在这里获得的功能是使用列表元素作为过程的参数(参见 Eli 的回答)。

标签: list scheme racket procedures


【解决方案1】:

您要查找的内容称为apply

【讨论】:

    【解决方案2】:

    map 怎么样,它可以与不同的过程定义一起使用吗?

    (define foo2
    
    (lambda (x)
      (* x 2)))
    
    (map foo2 '(1 2 3 4 5))
    

    【讨论】:

      【解决方案3】:

      一些实现你想做的事......

      (define (foo lst)
        (map (lambda (x) (* 2 x)) lst))
      
      (define (foo lst)
        (apply (lambda args (map (lambda (x) (* x 2)) args)) lst))
      
      (define foo
        (lambda args (map (lambda (x) (* x 2)) args))
      

      只是为了好玩,apply 的一个非常酷的用法是转置矩阵。考虑:

      (define grid     '((1 2 3) 
                         (4 5 6) 
                         (7 8 9)
      ))
      

      那么,

      (apply map list grid)
      => '((1 4 7)
           (2 5 8)
           (3 6 9))
      

      【讨论】:

        猜你喜欢
        • 2014-05-03
        • 2013-11-13
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多