Clojure reduce函数的意外结果

Clojure reduce函数的意外结果,clojure,Clojure,我想从向量中得到最小的元素。为此,我结合使用reduce和min功能。但是,在提供自己的min实现时,我得到了意想不到的结果: user=> (reduce (fn [x y] (< x y) x y) [1 2 3 2 1 0 1 2]) 2 user=> (reduce min [1 2 3 2 1 0 1 2 3]) 0 user=>(减少(fn[xy]((减少最小值[1 2 3 2 1 0 1 2 3]) 0 使用标准min的reduce按预期返回0。但是,当我提供

我想从向量中得到最小的元素。为此,我结合使用
reduce
min
功能。但是,在提供自己的
min
实现时,我得到了意想不到的结果:

user=> (reduce (fn [x y] (< x y) x y) [1 2 3 2 1 0 1 2])
2
user=> (reduce min [1 2 3 2 1 0 1 2 3])
0
user=>(减少(fn[xy]((减少最小值[1 2 3 2 1 0 1 2 3])
0

使用标准
min
的reduce按预期返回0。但是,当我提供自己的实现时,它返回2。我做错了什么?

您缺少一个
,如果

(reduce (fn [x y] (if (< x y) x y)) ...)
                   ^-- note the if
(减少(fn[xy](如果(

工作正常。:-)

与reduce一起使用的fn可能需要处理3个算术数-0、1和2个参数。

如果函数体周围有
,则缺少
。现在发生的是:

user> (use 'clojure.contrib.trace)
nil
user> (defn foo [x y] (< x y) x y)
#'user/foo
user> (dotrace [foo] (reduce foo [1 2 3 2 1 0 1 2]))
TRACE t2229: (foo 1 2)
TRACE t2229: => 2
TRACE t2230: (foo 2 3)
TRACE t2230: => 3
TRACE t2231: (foo 3 2)
TRACE t2231: => 2
TRACE t2232: (foo 2 1)
TRACE t2232: => 1
TRACE t2233: (foo 1 0)
TRACE t2233: => 0
TRACE t2234: (foo 0 1)
TRACE t2234: => 1
TRACE t2235: (foo 1 2)
TRACE t2235: => 2
2

不是真的。
min
的实现提供了一个示例,说明在Clojure本身没有空值实现的函数中使用
reduce
。此外,Clojure的
reduce
从不使用一元格;长度为1的序列始终缩减为其唯一元素。最终,如果要处理空序列(如果愿意将其视为错误输入,则可以不使用它),则需要一个空值大小写,并且肯定需要一个二进制大小写(如果永远不处理长度大于1的序列,则无论如何使用
reduce
)。
(defn min
  "Returns the least of the nums."
  ([x] x)
  ([x y] (if (< x y) x y))
  ([x y & more]
   (reduce min (min x y) more)))