我想成对地将函数列表应用于值列表.
这是一个例子来说明.
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来定义辅助函数.
您始终可以匿名定义函数,内联:
(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)
如果您愿意稍微修改值的格式,事情会变得更简单:
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)就像你将要获得的那样简洁.
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |