Uczę się Clojure i próbuję zdefiniować funkcję, która pobiera zmienną liczbę parametrów ( funkcja wariadyczna ) i podsumowuje je (tak, podobnie jak procedura +). Jednak nie wiem, jak zaimplementować taką funkcję
Wszystko, co mogę zrobić, to:
(defn sum [n1, n2] (+ n1 n2))
Oczywiście ta funkcja przyjmuje tylko dwa parametry i tylko dwa parametry. Naucz mnie, jak sprawić, by akceptował (i przetwarzał) niezdefiniowaną liczbę parametrów.
seq
do funkcji sumującej . Na przykład: (sum '(1 2 3)) a wynik to 6?&
z dowolnej wersjidef fn(*args): pass
), Mogę ją wywołać, podając listę taką jak fn (* list_of_args). Czy mogę zrobić to samo w ubraniu?def fn(*args): pass
nie byłoby,fn([1,2,3])
alefn(1,2,3)
(oczywiście w zależności od tego, co dokładnie chcesz zrobić, ale staram się tu podążać za duchem)Yehoanathan wspomina o przeciążaniu arity, ale nie podaje bezpośredniego przykładu. Oto, o czym on mówi:
(defn special-sum ([] (+ 10 10)) ([x] (+ 10 x)) ([x y] (+ x y)))
(special-sum)
=>20
(special-sum 50)
=>60
(special-sum 50 25)
=>75
źródło
(fn ([] (+ 10 10)) ([x] (+ 10 x)) ([x y] (+ x y)))
(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)) )
źródło
Z http://clojure.org/functional_programming
źródło
(defn sum [& args] (print "sum of" args ":" (apply + args)))
To wymaga dowolnej liczby argumentów i dodaje je.
źródło