将函数序列应用于一系列值
问题描述:
我想将函数列表成对应用于值列表。将函数序列应用于一系列值
下面是一个例子来说明。
user=> (defn a [f x] (f x))
#'user/a
user=> (map a [inc dec] '(98 8))
(99 7)
注意我必须定义一个函数a,它接受一个函数并将其应用于一个值。基本上抽象功能应用程序。
有没有更自然的方式来做到这一点?我真的只想用定义辅助函数的地图。
答
你总是可以匿名定义函数,内联:
(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)
答
如果你愿意稍微修改值的格式,事情变得简单一点:
user=> (map apply [inc dec] [[98] [8]])
(99 7)
这是必要的,因为apply
必须有一个序列作为其最后一个参数。这种转变([98 8]
=>[[98] [8]]
)无论如何都感觉是合理的,因为否则你就会依赖这样一个事实,即函数每次只能取一个值。这当然容易做到:
user=> (map list [98 8])
((98) (8))
否则,Joost的的映射功能#(%1 %2)
是尽量精简你会得到什么。