为什么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)))
答案 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 ... 包括在这种情况下没有任何相邻对的情况。