匿名函数的正确语法

时间:2012-05-07 16:57:22

标签: clojure functional-programming higher-order-functions

以下两个函数中的第一个函数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)。 谢谢。

2 个答案:

答案 0 :(得分: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)))

事实证明你根本不需要匿名功能!

答案 1 :(得分: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)