2

次の2つの関数の最初のfn-apply-cmp-valsは、2番目の関数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)具体的には、関数呼び出しではなく無名関数に置き換えたいと思います。ありがとうございました。

4

2 に答える 2

3

これを、一度に 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部分関数はこの要件を満たしているため、代わりにマップ関数に直接渡すことができます。

(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)))

したがって、無名関数はまったく必要ないことがわかりました。

于 2012-05-07T17:04:43.613 に答える
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)ください。

于 2012-05-07T17:11:26.333 に答える