为什么clojure允许使用lessthan(<)或大于(>)运算符/函数的单个参数

时间:2015-12-03 04:29:40

标签: clojure

为什么clojure允许使用lessthan(<)或大于(>)运算符/函数的单个参数? 我想知道为什么它只是返回'true'而不是强迫至少2个参数?

来源:

(defn >
  "Returns non-nil if nums are in monotonically decreasing order,
  otherwise false."
  {:inline (fn [x y] `(. clojure.lang.Numbers (gt ~x ~y)))
   :inline-arities #{2}
   :added "1.0"}
  ([x] true)
  ([x y] (. clojure.lang.Numbers (gt x y)))
  ([x y & more]
   (if (> x y)
     (if (next more)
       (recur y (first more) (next more))
       (> y (first more)))
     false)))

3 个答案:

答案 0 :(得分:7)

如果你考虑单调减少'与第一个之后的任何值相比,是否存在大于前一个值(我们将其拒绝为单调递减系列)'然后是{{1}的单个参数}(和>如果你说增加/少于)满足这个定义。

答案 1 :(得分:2)

可能有一个更好的理由,但一个简单的原因就是:说你从某个地方得到了一个清单,你想检查它的订购,你可以这样做:

(let [ls (list-from-somplace)]
  (apply < ls)

如果clojure不支持<函数的1个参数,则必须手动检查列表的长度,使代码略显丑陋:)

修改

火星队提出了一个很好的观点,我们仍然需要处理空名单,引入丑陋:

(let [ls (list-from-someplace)]
  (when ls (apply < ls))) 

答案 2 :(得分:2)

可以无限期地获取许多参数的Clojure操作符通常只接受零或一个,如果这样做有意义的话。例如,

(+) ;0

正如@Mars指出的那样,令人惊讶的是>没有归零true。返回true的Arity是你期望的。

逻辑上, for all ... 包括在这种情况下没有任何相邻对的情况。