我想將函數列表成對應用於值列表。將函數序列應用於一系列值
下面是一個例子來說明。
user=> (defn a [f x] (f x))
#'user/a
user=> (map a [inc dec] '(98 8))
(99 7)
注意我必須定義一個函數a,它接受一個函數並將其應用於一個值。基本上抽象功能應用程序。
有沒有更自然的方式來做到這一點?我真的只想用定義輔助函數的地圖。
我想將函數列表成對應用於值列表。將函數序列應用於一系列值
下面是一個例子來說明。
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)
是儘量精簡你會得到什麼。