1

我想在一个列表上按顺序映射三个不同的函数。为了说明我的意思,假设我们要做以下三个映射:

(map foo mylist)
(map bar mylist)
(map foobar mylist)

如果我们将 mylist 定义为'(1 2 3),并且一次运行一个上述函数,我们会得到:

(map foo mylist)     ===>  (foo1 foo2 foo3)
(map bar mylist)     ===>  (bar1 bar2 bar3)
(map foobar mylist)  ===>  (foobar1 foobar2 foobar3)

相反,我希望输出采用以下格式:

===>  ((foo1 bar1 foobar1) (foo2 bar2 foobar2) (foo3 bar3 foobar3))

你会怎么做?

4

1 回答 1

6

可以嵌套两个maps来达到想要的效果:

(map (lambda (e)
       (map (lambda (f) (f e))
            myfuncs))
     mylist)

上面mylist是输入列表,myfuncs是函数列表。例如,这些列表:

(define myfuncs (list sqrt square cube))
(define mylist '(1 2 3))

...将产生此输出:

'((1 1 1) (1.4142135623730951 4 8) (1.7320508075688772 9 27))
于 2013-10-02T20:04:57.630 回答