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



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

来源:

(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)))

如果您认为"单调递减"与"第一个值之后是否有任何值大于前一个值(对此,我们将拒绝将其作为单调递减序列)"相同,则>(和<,如果您说递增/小于)的单个自变量满足此定义。

可能有更好的理由,但一个简单的理由是:假设你从某个地方得到了一个列表,你想检查它是否有序,你可以简单地做:

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

如果clojure不支持<函数的1个参数,那么您将不得不手动检查列表的长度,从而使代码变得更丑陋:)

编辑

mars提出了一个很好的观点,我们仍然需要处理空列表,引入丑陋:

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

可以无限期地接受多个参数的Clojure运算符通常只接受零或一个,如果这样做有意义的话

(+) ;0

正如@Mars所指出的,令人惊讶的是,>没有返回零arity的true。Arity one回归true正是你所期待的。

从逻辑上讲,适用于所有包括没有任何相邻对的情况。

相关内容

最新更新