2014-06-28 34 views
2

當一個負值傳遞給它的x參數時,它一直嘮叨我如何在函數中返回一個正值。我的想法是,兩個負值相乘會產生一個正值,但這似乎相當混亂,因爲函數中任何地方都沒有發生乘法運算。當負值傳遞給此abs函數時,Clojure如何產生正值?

有人能給我詳細的解釋爲什麼傳遞給x的負值返回正值嗎?

(def abs 
    (fn [x] 
     (cond (> x 0) x 
      (= x 0) 0 
      (< x 0) (- x)))) 

(abs -10) -> 10 

的代碼在書中找到SICP ABS功能的變化,但用Clojure寫的。

親切的問候

+0

僅供參考,Clojure否定,pos?和零?功能。另外,您可以使用Java interop來調用Math/abs。例如,(Math/abs -10)返回10. – miner49r

+0

請注意,在Clojure數字塔中,Math/abs不適用於所有數值類型。 – NielsK

+1

第3行的右括號應該移到最後。編輯修復?這似乎是一個錯字,而不是與你的問題有關。 –

回答

7

當數字爲負,(< x 0),我們否定它,(- x),得到相同幅度的正數。如果你喜歡,你可以把否定乘以-1。

 
(doc -) 
------------------------- 
clojure.core/- 
([x] [x y] [x y & more]) 
    If no ys are supplied, returns the negation of x, else ... 
+4

這些n元函數值得指出'+'和'*'在概念上更簡單。由於'+'和'*'是可交換的並且有一個標識元素,所以很容易說'(+)== 0','(+ x)​​== x'和'(+ xy)== x + y' 。類似地,(*)== 1','(* x)= x'和'(* x y)== xy'。儘管減法和除法不可交換。這意味着'( - )'或'(/)'沒有真正的明顯價值,但至少有'( - x)'和'(/ x)',相對於'+ '和'*'是有用的。 –