2015-12-15 8 views
6

Ich habe die folgende FunktionClojure Teil rechts

(defn fun [a b] (str a b)) 

(fun "1" "2") ;; --> "12" 

Dank (partial) ich es in (fun b) und haben eine feste a

(def fun2 (partial fun "1")) 

(fun2 "2") ;; --> "12" 

Hat clojure haben so etwas wie (partial-right) oder so drehen kann neu anordnen die Argumente einer Funktion, so dass anstelle einer festen a ich eine feste b haben kann und damit die Funktion (fun a) haben?

Dank

+5

seit es vor kurzem in IRC gefragt wurde, nein. Option: '# (fun%" 2 ")' – cfrick

+1

@cfrick Beachten Sie, dass dies nicht äquivalent zu 'partially' (oder einem verwandten Konstrukt) ist, wenn' fun' unrein ist; siehe [diese Frage] (http://stackoverflow.com/questions/20931512/partial-vs-function-literal-when-memoize). –

+0

"Spaß"? ich, e. 'Fn', @cfrick? – Mars

Antwort

0

Für Ihr spezielles Beispiel, das Sie mit Multi arity gehen könnte:

(defn fun 
    ([a b] (str a b)) 
    ([a] (str a "1"))) 
+1

Dies beantwortet die Frage nicht, bietet nur eine Lösung für das unmittelbare Beispiel des Autors. – acron

2
(defn partial-right [f & args1] 
    (fn [& args2] 
     (apply f (concat args2 args1)))) 

Aber fragen Sie sich ... warum ist das nicht schon Teil der Standardbibliothek? Sind vielleicht andere Leute auf diesem Weg gewandert und es ist schlecht geworden?

+1

Ich weiß es nicht. Was ist deine Meinung? –

+0

@NeilMasson Nun, ich war in dieser genauen Position, weshalb ich eine Code-Antwort auf diese Frage habe, aber ich wurde von einem älteren Clojurian herausgefordert und erhielt diesen Rat. Es könnte als nicht-idiomatisch betrachtet werden (ansonsten wäre es eine offensichtliche Ergänzung zur stdlib) – acron