2015-10-09 30 views
3

當你調用+零個參數爲什麼+(或*)的行爲與 - (或/)有零參數不同?

user=> (+) 
0 

我得到,因爲它是+不變的元素。它適用於*

user=> (*) 
1 

類似爲什麼這不適合工作 -/

user=> (-) 
ArityException Wrong number of args (0) passed to: core/- clojure.lang.AFn.throwArity (AFn.java:429) 

user=> (/) 
ArityException Wrong number of args (0) passed to: core// clojure.lang.AFn.throwArity (AFn.java:429) 
+0

我嘗試谷歌出來:lisp爲什麼+和 - 工作不同 – boucekv

+0

和:clojure爲什麼+和 - 工作方式不同 – boucekv

+0

沒有好的答案 – boucekv

回答

2

我想這種行爲的原因是+*與聚合函數的用法:這允許在數學公式中逃避大量的樣板代碼。請注意以下幾點:

(reduce +()) => 0 
(reduce *()) => 1 

選擇的值不會影響同質函數的總體結果。假設你必須在某個集合中找到10,20和所有物品的產品。這就是你要做的:

(defn product [items] 
    (* 10 20 (reduce * items))) 

所以,當你在一個科爾一些項目,它的工作完全可以預見:

(product [1 2 3]) => (* 10 20 (* 1 2 3)) 

當科爾是空的,你得到如下:

(product []) => (* 10 20 1) 

所以它正是你所期望的。

類似作品+

那麼,爲什麼它-/工作? 我會說他們不是聚合函數,傳統上他們是相反的聚合。而在數學有運營商+(Σ)和*(Π),也沒有運營商-/

再次,它只是一個猜測。也許有一些更深層次的原因。

+1

1+你說的和我寫的(或想寫的)相同,但更清楚。 – coredump

+0

是的,你是對的。我應該更仔細地閱讀現有的答案。 – leetwinski

2

技術的解釋是:

如果你檢查(source *)(source +)(source -)

你會看到*+可以是0參數而-功能不會。

(defn - 
([x] (. clojure.lang.Numbers (minus x))) 
([x y] (. clojure.lang.Numbers (minus x y))) 
([x y & more] 
    (reduce1 - (- x y) more))) 
2

注意-/工作方式不同,當他們被賦予一個參數:(- x 0)(- x)不同。 (/ x 1)(/ x)相同。 +*的實際參數是,當您的參數事先不可知時,您可以在列表(可能爲空)上列出applyreduce。同樣是不是分裂和否定真的,因爲你很少需要:

(apply/list) 

您至少有一個說法:

#(apply/(cons % list)) 

這是不具有權威性,只是一個猜測。

相關問題