2012-05-07 123 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