2015-04-24 14 views

Antwort

7

Das Problem ist, dass '(+ - * /) eine Liste von Symbolen ist, keine Liste von Funktionen. Symbole implementieren AFn und wenn sie mit zwei Argumenten versorgt wird, versucht die Funktion, das Symbol im ersten Argument (2 hier) nachzuschlagen und gibt das zweite Argument (5 hier) zurück, wenn die Suche fehlschlägt.

+1

Dies ist eine tiefer gehende Antwort auf meine Frage, ergänzt durch eine Lösung von @bsvingen. – user40129

4

Es gibt eine Funktion in Clojure ist, die genau das tut, was Sie wollen: juxt: http://clojuredocs.org/clojure.core/juxt

So Ihr Beispiel

(def funcs (juxt + - * /)) 
(funcs 2 5) 

Wenn jemand kommt mit einer guten Erklärung wäre, warum die map Ansatz nicht der Fall ist Arbeit möchte ich auch gerne hören.

11

Dies funktioniert: (map #(% 2 5) [+ - * /])

Dies gilt nicht: (map #(% 2 5) '[+ - * /])

auch nicht dies: (map #(% 2 5) '(+ - * /))

Der Grund dafür ist, dass, wenn Sie '(+ - * /) tun, können Sie eine Liste der Symbole erhalten +, - * und /, nicht die Funktionen, auf die sie sich beziehen - das Zitat gilt auch für die Werte der Liste.

Die Verwendung eines Vektors vermeidet dieses Problem.

Wenn Sie unbedingt eine Liste möchten, tun Sie (map #(% 2 5) (list + - * /)).

Verwandte Themen