Как сделать функцию Clojure принимать переменное количество параметров?
Я изучаю Clojure, и я пытаюсь определить функцию, которая принимает переменное количество параметров (вариационную функцию) и суммирует их (да, как и процедура +). Однако я не знаю, как реализовать такую функцию
Все, что я могу сделать, это:
(defn sum [n1, n2] (+ n1 n2))
Конечно, эта функция принимает только два параметра и только два параметра. Пожалуйста, научите меня, как заставить его принимать (и обрабатывать) число параметров undefined.
Ответы
Ответ 1
В общем случае, некоммутативный случай, вы можете использовать apply:
(defn sum [& args] (apply + args))
Поскольку сложение является коммутативным, что-то вроде этого тоже должно работать:
(defn sum [& args] (reduce + args))
&
вызывает привязку args
к остальной части списка аргументов (в этом случае весь список, так как ничего не осталось от &
).
Очевидно, что определение такой суммы не имеет смысла, поскольку вместо:
(sum a b c d e ...)
вы можете просто написать:
(+ a b c d e ....)
Ответ 2
Yehoanathan упоминает перегрузку arity, но не дает прямого примера. Вот о чем он говорит:
(defn special-sum
([] (+ 10 10))
([x] (+ 10 x))
([x y] (+ x y)))
(special-sum)
= > 20
(special-sum 50)
= > 60
(special-sum 50 25)
= > 75
Ответ 3
(defn my-sum
([] 0) ; no parameter
([x] x) ; one parameter
([x y] (+ x y)) ; two parameters
([x y & more] ; more than two parameters
(reduce + (my-sum x y) more))
)
Ответ 4
defn
- макрос, который упрощает определение функций. Clojure поддерживает перегрузку arity в одном объекте функции, функции самореференции и переменной функции с помощью &
От http://clojure.org/functional_programming
Ответ 5
(defn sum [& args]
(print "sum of" args ":" (apply + args)))
Это принимает любое количество аргументов и добавляет их.