2011-03-03 38 views
4

我怎麼能映射的功能,在價值序列及其相應的值序列中的每個函數:?地圖序列與序列

(map '(sequence of functions) '(sequence of values)) 

在功能序列的第n個功能應該適用於值序列中的第n個值。對不起,如果我不是很清楚。

例如,說(def fns '(#(+ 1 %) #(- 1 %)))

然後(map (some-clever-function-of fns) '(0 0))會產生(1 -1)因爲#(+ 1 %)被映射到第一0和#(- 1 %)到第二。

回答

10
  • 通過map不止一個參數序列,它會做你想要的。 (map f seq1 seq2)預計f是一個帶有兩個參數的函數; map會將seq1的第一個元素和seq2的第一個元素設置爲f,然後是每個元素的第二個元素等。只要任何參數序列用完,map就會停止,因此它也適用於無限序列。
  • 考慮使用矢量而不是引用列表。載體以「數據」而非「代碼」的形式出現,您不必引用它們。
  • 你的示例函數不會做你想要的;兩者都返回1.我懷疑你的意思是#(+ % 1)#(- % 1)。這兩個分別位於clojure.core,分別稱爲incdec

所以:

user> (map (fn [f x] (f x)) 
      [inc dec] 
      [0 0]) 
(1 -1) 

或者:

user> (map #(%1 %2) [inc dec] [0 0]) 
(1 -1) 
+1

;或用「適用「例如(map apply [inc dec] [[0] [0]])=>(1,-1)?儘管數據seq有點醜陋。 – Markc 2011-03-03 15:01:46

+0

@ brian-carper謝謝! – Hendekagon 2011-03-04 01:19:12

1

我通常定義invoke功能,其作用類似於apply但沒有列表的潰散:

(defn invoke [f & args] 
    (apply f args)) 

(map invoke [+ -] [1 2] [3 4]) 
(4 -2) ; 1 + 3, 2 - 4