【问题标题】:How does Clojure produce a positive value when a negative value is passed to this abs function?当一个负值传递给这个 abs 函数时,Clojure 如何产生一个正值?
【发布时间】:2014-06-28 20:54:35
【问题描述】:

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

有人可以详细解释一下为什么传递给 x 的负值会返回正值吗?

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

(abs -10) -> 10

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

亲切的问候

【问题讨论】:

  • 仅供参考,Clojure 有 neg?,pos?和零?职能。此外,您可以使用 Java 互操作来调用 Math/abs。例如,(Math/abs -10) 返回 10。
  • 请注意,Math/abs 不适用于 Clojure 数值塔中的所有数值类型。
  • 第 3 行的右括号应该移到最后。编辑修复?这似乎是一个错字,而不是与您的问题有关。
  • 您评论说两个负数相乘产生一个正数,但是......似乎没有相乘。乘法并不是将负数转换为正数的唯一方法。函数(defn - ([x] ...)) always 将负数转换为正数 - 反之亦然 - 无需乘法。

标签: clojure scheme sicp


【解决方案1】:

当数字为负数时,(&lt; x 0),我们取反它,(- x),得到一个相同大小的正数。如果你愿意,你可以把否定看作是乘以 -1。

(文档-) ------------------------- clojure.core/- ([x] [x y] [x y & 更多]) 如果没有提供 ys,则返回 x 的否定,否则...

【讨论】:

  • 值得指出的是,+* 在概念上更简单。因为+* 是可交换的并且有一个恒等元素,所以很容易说(+) == 0(+ x) == x(+ x y) == x+y。同样(*) == 1(* x) = x(* x y) == xy。减法和除法虽然不是可交换的。这意味着 (-)(/) 没有真正合理的价值,但至少对于 (- x)(/ x),返回 x 相对于 +* 的倒数是有用的。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2016-11-24
  • 2018-03-23
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
相关资源
最近更新 更多