2012-10-07 4 views
6

のClojure:(FNのコルを適用)VS(#を適用する(FNの%&)コルを適用)私はlabreplを通じて自分の道を働いていると私は、このパターンは以下のいくつかのコードを見

;; Pattern 
(apply #(apply f %&) coll) 

;; Concrete example 
user=> (apply #(apply + %&) [1 2 3 4]) 
10 

これがあると思われるがこのパターンに相当する:

;; Pattern 
(apply f coll) 

;; Concrete example 
user=> (apply + [1 2 3 4]) 
10 

これらのパターンは同じですか?そうでない場合は、違いは何ですか?いつ他のものを使用しますか?

私はlabreplのセルラー・オートマトンラボでstep functionから元のパターンを取った:

(defn step 
    "Advance the automation by one step, updating all cells." 
    [board] 
    (doall 
    (map (fn [window] 
      (apply #(apply map brians-brain-rules %&) 
       (doall (map torus-window window)))) 
     (torus-window board)))) 

更新:を私は質問を明確に支援するために、各パターンの具体的な例を追加しました。

答えて

4

いいえ、違いはありません。長いフォームを書く理由はありません。私はそれが一度に意味をなさないコードへの段階的な変更によってそれが到着したと仮定することができます。

+0

合意。私はおそらくパラメータが違いを生むかもしれないと思ったのですが、 'apply#fn [c](map + c [1 1 1]))%&)[[-1 -1 -1]])' ' (apply(fn [c](map + c [1 11]))[[-1 -1 -1]]) 'は同等でした。 – noahlz

0

本質的に、両方のフォームは同じことを達成し、ほぼ同じです。それぞれは、無名関数を導入する方法を提供します。

を使用する#(...は、無名関数の略語であるClojureリーダーです。 (fn [arg1 & args]...と同等ですが、#(...匿名関数を別の関数に埋め込むことはできません。引数は、(fn [arg & args]ではなく、% %2...または%1 %2...と表されます。

どちらも匿名関数を表現する方法です。 #(...はより単純な機能に使用され、(fn...はより詳細な機能に使用されます。

#(...は少し物足りなく見える傾向があります。

+1

いいえ...なぜ2つの機能が適用されますか? – noahlz

+0

私の質問は、匿名関数のさまざまな構文に関するものではありません。質問を明確にするために例を追加しました。 – rigdern

+0

@rigdern funcを使って関数を表現すると、誤解を招く恐れがあります。私は質問を編集しました。 – soulcheck

関連する問題