Судя по комментариям, решение явно +
, но, возможно, стоит рассмотреть его подробнее, чтобы понять, почему. Как оказалось, тут многое.
Во-первых, давайте посмотрим на reduce чтобы узнать, каковы требования:
(defn reduce
"f should be a function of 2 arguments. If val is not supplied,
returns the result of applying f to the first 2 items in coll, then
applying f to that result and the 3rd item, etc. If coll contains no
items, f must accept no arguments as well, and reduce returns the
result of calling f with no arguments. ..."
...
([f coll]
(if (instance? clojure.lang.IReduce coll)
(.reduce ... coll f)
...))
([f val coll]
(if (instance? clojure.lang.IReduceInit coll)
(.reduce ... coll f val)
...)))
Это функция множественной арности, которая либо принимает функцию и коллекцию, либо функцию, начальное значение и коллекцию.
+ также функция множественной арности, которая ведет себя в зависимости от того, сколько аргументов вы передаете ей. Источник ниже (отредактированный для частей, которые нас интересуют) показывает, что сокращение удовлетворяется 0-арностью и 2-арностью.
(defn +
"Returns the sum of nums. (+) returns 0..."
...
([] 0)
...
([x y] (. clojure.lang.Numbers (add x y)))
...
Ясно, что (reduce + [])
вызывает первое предложение и возвращает 0. Объясняется тест 2.
Это работает для первого теста, применяя функцию добавления к каждой паре чисел, что происходит во внутренних компонентах Java для Clojure, в тесном for
цикле.
Последний тест работает точно так же, как и первый, за исключением того, что он вызывает [v val coll]
реализацию сокращения. Это относится к немного другому внутренняя функция, но с тем же эффектом.
Примечания
[1]: IFn
— это Интерфейс Java для функций clojure
person
munk
schedule
26.12.2015
(+)
? - person nha   schedule 11.12.2015(+)
не тай-файтер? - person Mark Fisher   schedule 11.12.2015