当将负值传递到此abs函数时,Clojure如何生成正值?

当将负值传递到此abs函数时,Clojure如何生成正值?,clojure,scheme,sicp,Clojure,Scheme,Sicp,当一个负值传递给它的x参数时,cond如何在函数中返回一个正值一直困扰着我。我的想法是两个负数相乘产生一个正数,但这似乎很混乱,因为函数中的任何地方似乎都没有发生乘法 有人能给我一个详细的解释为什么传递给x的负值返回正值吗 (def abs (fn [x] (cond (> x 0) x (= x 0) 0 (< x 0) (- x)))) (abs -10) -> 10 (def abs (fn[x] (

当一个负值传递给它的x参数时,cond如何在函数中返回一个正值一直困扰着我。我的想法是两个负数相乘产生一个正数,但这似乎很混乱,因为函数中的任何地方似乎都没有发生乘法

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

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

(abs -10) -> 10
(def abs
(fn[x]
(cond(>x0)x
(=x0)0
(10
该代码是《SICP》一书中abs函数的变体,但是用Clojure编写的


当这个数是负数时,我们将它取反,得到一个相同大小的正数。如果你愿意,你可以把否定看成是-1的乘法

(doc -) ------------------------- clojure.core/- ([x] [x y] [x y & more]) If no ys are supplied, returns the negation of x, else ... (文件-) ------------------------- clojure.core/- ([x][x y][x y及更多]) 如果没有提供Y,则返回x的求反,否则。。。
仅供参考,Clojure没有,位置?零呢?功能。此外,还可以使用Java互操作调用Math/abs。例如,(Math/abs-10)返回10。请注意,Math/abs不适用于Clojure数字塔中的所有数字类型。第3行的右括号应移到末尾。编辑以修复?这似乎是一个打字错误,与你的问题无关。你评论说两个否定相乘产生一个肯定,但是。。。似乎没有乘法运算。乘法不是将负数转换成正数的唯一方法。函数
(defn-([x]…)
总是在不进行乘法的情况下将负数转换为正数,反之亦然。值得指出的是,使用这些n元函数,
+
*
在概念上更简单。由于
+
*
是可交换的,并且有一个标识元素,所以很容易说
(+)==0
(+x)==x
(+xy)==x+y
。类似地,
(*)==1
(*x)=x
(*x y)==xy
。减法和除法是不可交换的。这意味着
(/)
没有真正合理的值,但至少对于
(-x)
(/x)
,返回
+
*
x的倒数是有用的。