2012-05-07 41 views
2

以下兩個函數中的第一個函數fn-apply-cmp-vals返回在第二個函數apply-cmp-vals中使用的部分函數。匿名函數的正確語法

在apply-cmp-vals中將fn-apply-cmp-vals作爲匿名函數嵌入的正確語法是什麼?

(defn fn-apply-cmp-vals 
    [fn cmp-sos cmp-idx] 
    (partial fn cmp-sos cmp-idx)) 

(defn apply-cmp-vals 
    [cmp-vec cmp-vals cmp-vec-idx] 
    (let [fn-cmp (fn-apply-cmp-vals ret-non-match-rows cmp-vec cmp-vec-idx)] 
     (map #(fn-cmp %1) cmp-vals))) 

具體而言,我想用一個匿名函數而不是函數調用來代替fn-apply-cmp-vals ret-non-match-rows cmp-vec cmp-vec-idx)。 謝謝。

回答

3

讓我們一起來看看這個細節。

您的目標是作爲apply-cmp-vals中的匿名函數內聯fn-apply-cmp-vals。所以我們先做。這裏是你的功能看起來像沒有其他的變化:

(defn apply-cmp-vals 
    [cmp-vec cmp-vals cmp-vec-idx] 
    (let [fn-cmp ((fn [f cmp-sos cmp-idx] (partial f cmp-sos cmp-idx)) 
        ret-non-match-rows cmp-vec cmp-vec-idx)] 
    (map #(fn-cmp %1) cmp-vals))) 

這完成你的目標,但有改進的餘地。由於您的函數只需使用給定的參數調用partial,我們可以用正確的參數直接調用partial來替換匿名函數。這是有效的,因爲partial返回一個部分應用的函數。

(defn apply-cmp-vals 
    [cmp-vec cmp-vals cmp-vec-idx] 
    (let [fn-cmp (partial ret-non-match-rows cmp-vec cmp-vec-idx)] 
    (map #(fn-cmp %1) cmp-vals))) 

現在,讓我們看看在哪裏使用fn-cmp。它正在用一個參數在它自己的匿名函數中調用。既然你的部分函數滿足這個要求,你可以直接將fn-cmp直接傳遞給map函數。

(defn apply-cmp-vals 
    [cmp-vec cmp-vals cmp-vec-idx] 
    (let [fn-cmp (partial ret-non-match-rows cmp-vec cmp-vec-idx)] 
    (map fn-cmp cmp-vals))) 

最後,如果你願意,你可以完全刪除let形式:

(defn apply-cmp-vals 
    [cmp-vec cmp-vals cmp-vec-idx] 
    (map (partial ret-non-match-rows cmp-vec cmp-vec-idx) cmp-vals))) 

因此,原來你並不需要一個匿名函數在所有!

+0

謝謝。我會去檢查一下。 – octopusgrabbus

+1

你也可以直接映射'(partial ret-non-match-rows cmp-vec cmp-vec-idx)'而不是'#(ret-non-match-rows cmp-vec cmp-vec-idx%1)'在最後的解決方案。 –

+0

@RafałDowgird,是的,好點。 – Jeremy

2

我知道你在尋找的是:

(defn apply-cmp-vals 
    [cmp-vec cmp-vals cmp-vec-idx] 
    (let [fn-cmp (partial ret-non-match-rows cmp-vec cmp-vec-idx)] 
     (map fn-cmp cmp-vals))) 

fn-apply-cmp-vals做得並不比通過它的參數partial其他任何東西。

(partial ret-non-match-rows cmp-vec cmp-vec-idx)將返回一個匿名函數。

fn-cmp是一個函數,所以用(map fn-cmp com-vals)代替(map #(fn-cmp %1) cmp-vals)

+0

感謝您的回答。我忘了部分本身返回一個函數。 – octopusgrabbus