2

以下两个函数中的第一个函数 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)用匿名函数代替函数调用。谢谢你。

4

2 回答 2

3

让我们一步一步地详细看一下。

您的目标是fn-apply-cmp-vals作为匿名函数内联到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)))

所以事实证明你根本不需要匿名函数!

于 2012-05-07T17:04:43.613 回答
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 %1) cmp-vals)(map fn-cmp com-vals).

于 2012-05-07T17:11:26.333 回答