将函数序列应用于值序列

yal*_*lis 7 clojure

我想成对地将函数列表应用于值列表.

这是一个例子来说明.

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

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

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

Joo*_*aat 8

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

(map (fn [f x] (f x)) [inc dec] '(98 8))
Run Code Online (Sandbox Code Playgroud)

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

(map #(%1 %2) [inc dec] '(98 8))
Run Code Online (Sandbox Code Playgroud)

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

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


trp*_*lin 5

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

user=> (map apply [inc dec] [[98] [8]])
(99 7)
Run Code Online (Sandbox Code Playgroud)

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

user=> (map list [98 8])
((98) (8))
Run Code Online (Sandbox Code Playgroud)

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