(def ops '(+ - * /))
(map #(% 2 5) ops)
eine Liste der Funktion Parameter Anwenden, clojure
(5 5 5 5)
gibt Dies macht keinen Sinn für mich. Warum gibt dies eine Liste von 5 anstelle von Ergebnissen von Funktionsaufrufen zurück?
(def ops '(+ - * /))
(map #(% 2 5) ops)
eine Liste der Funktion Parameter Anwenden, clojure
(5 5 5 5)
gibt Dies macht keinen Sinn für mich. Warum gibt dies eine Liste von 5 anstelle von Ergebnissen von Funktionsaufrufen zurück?
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.
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.
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 + - * /))
.
Dies ist eine tiefer gehende Antwort auf meine Frage, ergänzt durch eine Lösung von @bsvingen. – user40129