如何将函数列表应用于列表/变量?

时间:2017-01-24 16:59:13

标签: functional-programming scheme racket

我有一个可变长度函数列表

(list proc1 proc2 ...)

我有一个变量列表

(list 1 2 3 4 5 ...)

我想将这些函数应用于变量列表。

如何将这些功能应用到我的列表中?

编辑:

如果我有sin和tan以及0.1,0.2和0.3,那么我想得到9个结果。

2 个答案:

答案 0 :(得分:4)

使用理解来迭代过程和数字,您最终会得到一个包含n^2元素的列表。例如:

(for*/list ((f (list sin cos tan))
            (x (list 0.1 0.2 0.3)))
  (f x))

=> '(0.09983341664682815
     0.19866933079506122
     0.29552020666133955
     0.9950041652780257
     0.9800665778412416
     0.955336489125606
     0.10033467208545055
     0.20271003550867248
     0.3093362496096232)

答案 1 :(得分:0)

以下是除* / list之外的一些方法:

可以通过2个单独的/ list来获取列表列表:

(for/list ((f (list sin cos tan)))
  (for/list ((x (list 0.1 0.2 0.3)))
    (f x)))

输出:

'((0.09983341664682815 0.19866933079506122 0.29552020666133955)
  (0.9950041652780258 0.9800665778412416 0.955336489125606)
  (0.10033467208545055 0.2027100355086725 0.30933624960962325))

如果想要使用简单的',可以将答案添加到现有列表中:

(define outlist '())
(for ((f (list sin cos tan)))
  (for ((x (list 0.1 0.2 0.3)))
    (set! outlist (cons (f x) outlist))))
outlist 

输出:

'(0.30933624960962325
  0.2027100355086725
  0.10033467208545055
  0.955336489125606
  0.9800665778412416
  0.9950041652780258
  0.29552020666133955
  0.19866933079506122
  0.09983341664682815)

以下是使用' for':

的另一个版本
(define fl (list sin cos tan))
(define vl (list 0.1 0.2 0.3))

(for* ((x 3)(y 3))         ; all combinations of x and y from (0,1,2)
  (println ((list-ref fl x) (list-ref vl y))))

'命名为'也可以用来代替':

(let loop ((fl (list sin cos tan)))
  (cond
    [(empty? fl) (println "End.")]
    [else 
     (for ((v (list 0.1 0.2 0.3)))
       (println ((first fl) v)))
     (loop (rest fl))]))

两个for循环也可以被命名为let':

替换
(let outer ((fl (list sin cos tan)))
  (cond
    [(empty? fl)
     (println "End.")]
    [else 
     (let inner ((vl (list 0.1 0.2 0.3)))
       (cond
         [(empty? vl)]
         [else
          (println ((first fl) (first vl)))
          (inner (rest vl))]))
     (outer (rest fl))]))

也可以组合两个地图来获取所有值:

(map (λ (x)
       (map x (list 0.1 0.2 0.3)))
     (list sin cos tan))

输出:

'((0.09983341664682815 0.19866933079506122 0.29552020666133955)
  (0.9950041652780258 0.9800665778412416 0.955336489125606)
  (0.10033467208545055 0.2027100355086725 0.30933624960962325))

HTH。