我正在学习Clojure,我正在尝试定义一个函数,该函数采用可变数量的参数(可变参数函数)并将它们相加(是的,就像+过程一样)。但是,我不知道如何实现这样的功能
我所能做的就是:
(defn sum [n1, n2] (+ n1 n2))
当然这个函数只需要两个参数和两个参数。请教我如何接受(和处理)未定义数量的参数。
答案 0 :(得分:98)
一般情况下,非交换案例可以使用apply:
(defn sum [& args] (apply + args))
由于加法是可交换的,所以这样的东西也应该起作用:
(defn sum [& args] (reduce + args))
&
会导致args
绑定到参数列表的其余部分(在本例中为整个列表,因为&
左侧没有任何内容)。
显然,定义这样的总和是没有意义的,因为而不是:
(sum a b c d e ...)
你可以写:
(+ a b c d e ....)
答案 1 :(得分:30)
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
答案 2 :(得分:17)
(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))
)
答案 3 :(得分:10)
的自引用和变量函数
defn
是一个宏,它使定义函数更简单一些。 Clojure支持单个函数对象中的arity重载, 使用&
答案 4 :(得分:3)
(defn sum [& args]
(print "sum of" args ":" (apply + args)))
这需要任意数量的参数并将它们加起来。