Clojure: Implementierung der Comp-Funktion
4ClojureProblem 58 wird angegeben als:
Schreiben Sie eine Funktion, mit der Sie Funktionszusammensetzungen erstellen können. Die Parameterliste sollte eine variable Anzahl von Funktionen enthalten und beim Erstellen einer Funktion von rechts nach links angewendet werden.
(= [3 2 1] ((__ rest reverse) [1 2 3 4]))
(= 5 ((__ (partial + 3) second) [1 2 3 4]))
(= true ((__ zero? #(mod % 8) +) 3 5 7 9))
(= "HELLO" ((__ #(.toUpperCase %) #(apply str %) take) 5 "hello world"))
Hier__
sollte durch die Lösung ersetzt werden.
In diesem Problem die Funktioncomp
sollte nicht eingesetzt werden.
Eine Lösung, die ich gefunden habe, ist:
(fn [& xs]
(fn [& ys]
(reduce #(%2 %1)
(apply (last xs) ys) (rest (reverse xs)))))
Es klappt. Aber ich verstehe nicht wirklich, wie das gehtreduce
arbeitet hier. Wie stellt es dar?(apply f_1 (apply f_2 ...(apply f_n-1 (apply f_n args))...)
?