当负值传递给这个abs函数时,Clojure如何产生正值?

123*_*36e 2 scheme clojure sicp

当一个负值传递给它的x参数时,它一直在唠叨cond如何在函数中返回正值.我的想法是两个负数乘以产生一个正数,但这看起来很混乱,因为在函数的任何地方似乎都没有出现乘法.

有人能给我详细解释为什么传递给x的负值会返回正值吗?

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

(abs -10) -> 10
Run Code Online (Sandbox Code Playgroud)

代码是SICP一书中abs函数的变体,但是用Clojure编写.

亲切的问候

A. *_*ebb 9

当数字为负时(< x 0),我们否定它,(- x)得到相同幅度的正数.如果你愿意的话,可以将否定乘以-1乘以.

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

  • 值得指出的是,使用这些n-ary函数,`+`和`*`在概念上更简单.由于`+`和`*`是可交换的并且有一个标识元素,所以很容易说`(+)== 0`,`(+ x)​​== x`和`(+ xy)== x + y` .类似地,`(*)== 1`,`(*x)= x`和`(*xy)== xy`.减法和除法不是可交换的.这意味着`( - )`或`(/)`没有真正明智的价值,但至少用`( - x)`和`(/ x)`,相对于`+返回'x`的反函数`和`*`很有用. (4认同)