2012-05-07 32 views
2

次の2つの関数の最初のfn-apply-cmp-valsは、2番目の関数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)を交換したいです。 ありがとうございます。

答えて

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

だから、それはあなたがすべてで無名関数を必要としなかったが判明します!私はあなたが探しているものだと思い

+0

ありがとうございました。私はこれをチェックするつもりです。 – octopusgrabbus

+1

'#(ret-non-match-rows cmp-vec cmp-vec-idx%1)'の代わりに '(部分一致不一致行' cmp-vec cmp-vec-idx) 'を直接マップすることもできます最後の解決策で –

+0

@RafałDowgird、はい、良い点。 – Jeremy

2

がされています。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 cmp-vals))) 

fn-apply-cmp-vals

(partial ret-non-match-rows cmp-vec cmp-vec-idx)は、匿名関数を返します。

fn-cmpは関数なので、(map #(fn-cmp %1) cmp-vals)(map fn-cmp com-vals)に置き換えてください。

+0

あなたの答えをありがとう。部分的には関数自体を返すのを忘れてしまった。 – octopusgrabbus