【问题标题】:Correct Syntax For Anonymous Function匿名函数的正确语法
【发布时间】:2012-05-07 16:57:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    让我们一步一步来详细了解一下。

    您的目标是将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)))
    

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

    【讨论】:

    • 谢谢。我去看看这个。
    • 也可以直接映射(partial ret-non-match-rows cmp-vec cmp-vec-idx),而不是上一个解决方案中的#(ret-non-match-rows cmp-vec cmp-vec-idx %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)

    【讨论】:

    • 感谢您的回答。我忘了 partial 本身返回一个函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多