2012-10-07 46 views
6

我通過labrepl工作我的方式,我看到了一些符合此模式代碼:的Clojure:(適用FN科爾)VS(申請#(適用FN%)科爾)

;; 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 

這些模式是否等同?如果沒有,有什麼區別,你什麼時候使用一個呢?

我把從step function前者格局labrepl的細胞自動機實驗室:

(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#(apply(fn [c](map + c [1 1 1]))%&)[[-1 -1 -1]]''和' (apply(fn [c](map + c [1 1 1]))[[-1 -1 -1]])是等價的。 – noahlz

0

基本上,兩種形式完成相同的事情,大致相同。每種方法都提供了一種引入匿名函數的方法。

使用#(...是對匿名函數的Clojure的讀者簡寫。這是一種相當於(fn [arg1 & args]...,但你不能嵌入裏面一個又一個#(...匿名函數和參數,表示爲% %2...%1 %2...,而不是與向量結合(fn [arg & args]

兩者都是表達匿名函數的方法。 #(...用於簡化功能,(fn...用於更詳細的功能。

#(...往往使事情看起來有點整潔。

+1

不...爲什麼這兩個應用功能? – noahlz

+0

我的問題不是關於匿名函數的不同語法。我在我的問題中添加了一些例子,使其更清晰。 – rigdern

+0

@rigdern使用'fn'來表示任何功能都是誤導性的,我編輯了問題 – soulcheck