以下两个函数中的第一个函数fn-apply-cmp-vals返回第二个函数apply-cmp-vals中使用的部分函数。
什么是正确的语法嵌入fn-apply-cmp-vals作为一个匿名函数在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)。谢谢。
发布于 2012-05-08 01:04:44
让我们详细了解一下这一点,一步一步来。
您的目标是在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传递给映射函数。
(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)))所以事实证明你根本不需要匿名函数!
发布于 2012-05-08 01:11:26
我想你要找的是:
(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)))除了将其参数传递给partial之外,fn-apply-cmp-vals没有做任何其他事情。
(partial ret-non-match-rows cmp-vec cmp-vec-idx)将返回一个匿名函数。
fn-cmp是一个函数,所以用(map fn-cmp com-vals)替换(map #(fn-cmp %1) cmp-vals)。
https://stackoverflow.com/questions/10485975
复制相似问题