我想成对地将一系列函数应用于值列表。
这是一个例子来说明。
user=> (defn a [f x] (f x))
#'user/a
user=> (map a [inc dec] '(98 8))
(99 7)
注意我必须定义一个函数a,它接受一个函数并将其应用于一个值。基本上是抽象函数应用程序。
有更自然的方法吗?我真的只想使用map来定义辅助函数。
答案 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)
就像你将要获得的那样简洁。