我正在学习Clojure,并且正在尝试定义一个函数,该函数采用可变数量的参数(可变参数函数)并将它们相加(是的,就像+过程一样)。但是,我不知道如何实现这种功能
我所能做的是:
(defn sum [n1, n2] (+ n1 n2))
当然,该功能仅采用两个参数和两个参数。请教我如何使其接受(和处理)数量不确定的参数。
我正在学习Clojure,并且正在尝试定义一个函数,该函数采用可变数量的参数(可变参数函数)并将它们相加(是的,就像+过程一样)。但是,我不知道如何实现这种功能
我所能做的是:
(defn sum [n1, n2] (+ n1 n2))
当然,该功能仅采用两个参数和两个参数。请教我如何使其接受(和处理)数量不确定的参数。
Answers:
通常,您可以使用apply:
(defn sum [& args] (apply + args))
由于加法是可交换的,因此类似的事情也应该起作用:
(defn sum [& args] (reduce + args))
&
导致args
绑定到参数列表的其余部分(在本例中为整个列表,因为的左边没有任何内容&
)。
显然,像这样定义总和是没有意义的,因为它不是:
(sum a b c d e ...)
你可以这样写:
(+ a b c d e ....)
seq
给您的sum函数。例如:(sum'(1 2 3)),结果为6?
&
从任何一个版本中删除
def fn(*args): pass
以使其带有* args(例如),我可以通过给出类似fn(* list_of_args)的列表来调用它。我可以在Clojure中做同样的事情吗?
def fn(*args): pass
不会fn([1,2,3])
,但fn(1,2,3)
(显然这取决于你想要做什么,但我想在这里跟随灵)
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
(fn ([] (+ 10 10)) ([x] (+ 10 x)) ([x y] (+ x y)))
defn
是一个宏,它使函数定义更加简单。Clojure支持使用单个函数对象,自引用和可变arity函数中的arity重载&
(defn sum [& args]
(print "sum of" args ":" (apply + args)))
这需要任意数量的参数并将其加起来。