Clojure 匿名函数的正确语法
以下两个函数中的第一个函数fn apply cmp vals返回第二个函数apply cmp vals中使用的部分函数 在apply cmp VAL中嵌入fn apply cmp VAL作为匿名函数的正确语法是什么Clojure 匿名函数的正确语法,clojure,functional-programming,higher-order-functions,Clojure,Functional Programming,Higher Order Functions,以下两个函数中的第一个函数fn apply cmp vals返回第二个函数apply cmp vals中使用的部分函数 在apply cmp VAL中嵌入fn apply cmp VAL作为匿名函数的正确语法是什么 (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]
(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)
。
谢谢。让我们一步一步地详细了解一下 您的目标是将
fn应用cmp VAL作为apply cmp VAL
中的匿名函数内联。所以让我们先这样做。以下是您的函数在没有其他更改的情况下的外观:
(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)))
原来你根本不需要匿名函数 我想你要找的是:
(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
之外,没有执行任何操作
(部分ret非匹配行cmp vec cmp vec idx)
将返回一个匿名函数
(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
是一个函数,因此将(map#(fn-cmp%1)cmp-vals)
替换为(map-fn-cmp-com-vals)
,谢谢。我去看看。您也可以直接映射上一个解决方案中的(部分ret非匹配行cmp vec cmp vec idx)
,而不是#(ret非匹配行cmp vec cmp vec idx%1)
。谢谢您的回答。我忘记了partial本身返回一个函数。