2011-03-27 49 views
7

我想将函数列表成对应用于值列表。将函数序列应用于一系列值

下面是一个例子来说明。

user=> (defn a [f x] (f x)) 
#'user/a 
user=> (map a [inc dec] '(98 8)) 
(99 7) 

注意我必须定义一个函数a,它接受一个函数并将其应用于一个值。基本上抽象功能应用程序。

有没有更自然的方式来做到这一点?我真的只想用定义辅助函数的地图。

回答

8

你总是可以匿名定义函数,内联:

(map (fn [f x] (f x)) [inc dec] '(98 8)) 

或短,使用#()阅读器宏:

(map #(%1 %2) [inc dec] '(98 8)) 

这是一个相当尴尬的用例的,所以我怀疑你可以使用核心clojure或clojure.contrib将其缩短到更短的距离,但您可以轻松编写自己的抽象:

(defn mapfs [fs coll] (map #(%1 %2) fs coll)) 
(mapfs [inc dec] [98 8]) 
> (99 7) 
5

如果你愿意稍微修改值的格式,事情变得简单一点:

user=> (map apply [inc dec] [[98] [8]]) 
(99 7) 

这是必要的,因为apply必须有一个序列作为其最后一个参数。这种转变([98 8] =>[[98] [8]])无论如何都感觉是合理的,因为否则你就会依赖这样一个事实,即函数每次只能取一个值。这当然容易做到:

user=> (map list [98 8]) 
((98) (8)) 

否则,Joost的的映射功能#(%1 %2)是尽量精简你会得到什么。

相关问题