web-dev-qa-db-ja.com

Clojure関数を可変数のパラメーターを取る方法は?

私はClojureを学んでおり、可変数のパラメータ(variadic関数)を取り、それらを合計する関数を定義しようとしています(うん、+プロシージャのように)。しかし、私はそのような機能を実装する方法を知りません

私にできることはすべて:

(defn sum [n1, n2] (+ n1 n2))

もちろん、この関数は2つのパラメーターと2つのパラメーターのみを取ります。未定義の数のパラメーターを受け入れる(および処理する)方法を教えてください。

77
rodrigoalves

一般的に、非可換の場合は apply を使用できます:

(defn sum [& args] (apply + args))

加算は可換なので、次のようなものも動作するはずです。

(defn sum [& args] (reduce + args))

&は、argsを引数リストの残りの部分にバインドします(この場合、&の左側には何もないため、リスト全体)。

明らかにそのような合計を定義することは意味がありません。

(sum a b c d e ...)

あなたは書くことができます:

(+ a b c d e ....)
102
soulcheck

Yehoanathanはアリティのオーバーロードについて言及していますが、直接的な例を提供していません。彼が話していることは次のとおりです。

(defn special-sum
  ([] (+ 10 10))
  ([x] (+ 10 x))
  ([x y] (+ x y)))

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75

30
Devin Walters
 (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))
  )
17
hariszaman

defnは、関数の定義を少し簡単にするマクロです。 Clojureは、単一の関数オブジェクト、自己参照、および&

http://clojure.org/functional_programming から

10
viebel
(defn sum [& args]
  (print "sum of" args ":" (apply + args)))

これは、任意の数の引数を取り、それらを加算します。

3
amirt