将函数序列应用于值序列

时间:2011-03-27 01:49:57

标签: clojure

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

这是一个例子来说明。

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

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

有更自然的方法吗?我真的只想使用map来定义辅助函数。

2 个答案:

答案 0 :(得分:8)

您始终可以匿名定义函数,内联:

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

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

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

这是一个相当尴尬的用例,所以我怀疑你可以使用core clojure或clojure.contrib将它缩减到更短的东西,但你可以轻松编写自己的抽象:

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

答案 1 :(得分:5)

如果您愿意稍微修改值的格式,事情会变得更简单:

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

这是必要的,因为apply必须有一个seq作为它的最后一个参数。无论如何,这种转换([98 8] => [[98] [8]])感觉是合理的事情,因为否则你依赖于这些函数可能只取一个值的事实。这当然是微不足道的:

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

否则,Joost的映射函数#(%1 %2)就像你将要获得的那样简洁。