Clojure 匿名函数的正确语法

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]

以下两个函数中的第一个函数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]
    (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本身返回一个函数。