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