これを、一度に 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)))
したがって、無名関数はまったく必要ないことがわかりました。