2011-03-27 46 views
7

我想將函數列表成對應用於值列表。將函數序列應用於一系列值

下面是一個例子來說明。

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

注意我必須定義一個函數a,它接受一個函數並將其應用於一個值。基本上抽象功能應用程序。

有沒有更自然的方式來做到這一點?我真的只想用定義輔助函數的地圖。

回答

8

你總是可以匿名定義函數,內聯:

(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) 
5

如果你願意稍微修改值的格式,事情變得簡單一點:

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

這是必要的,因爲apply必須有一個序列作爲其最後一個參數。這種轉變([98 8] =>[[98] [8]])無論如何都感覺是合理的,因爲否則你就會依賴這樣一個事實,即函數每次只能取一個值。這當然容易做到:

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

否則,Joost的的映射功能#(%1 %2)是儘量精簡你會得到什麼。

相關問題