(Dies ist eine Frage in Bezug auf Stil. Ich weiß dies kann mit einem Bündel von conditionals, Multimethoden usw. durchgeführt werden)Ist es möglich, eine gemeinsame Bindung für alle Implementierungen in einer Mehrfachsignaturfunktion festzulegen?
In der folgenden Funktion wird null-vector
auf jeder Implementierung definiert. Wie kann ich es einmal für die gesamte Funktion einstellen? Ist es allgemein möglich, eine gemeinsame Bindung für alle Implementierungen festzulegen?
Eine Schließung wird nicht funktionieren, da es null-vector
braucht ein "Argument", aber ich nehme an, ich könnte partial
es. Dies würde jedoch immer noch eine Berechnung des Größenparameters erfordern. Ich möchte offensichtlich vermeiden, Code zu wiederholen.
(defn path
"Returns a lazy sequence of vectors representing a monotonic path
walked over coll in n-dimensional space, where n is the cardinality
of coll's alphabet."
([coll]
(let [alphabet (set coll)
cardinality (count alphabet)
alpha-map (apply hash-map (interleave alphabet (range cardinality)))
null-vector (vec (repeat cardinality 0))]
(path coll null-vector alpha-map)))
([coll alpha-map]
(let [null-vector (vec (repeat (count (keys alpha-map)) 0))]
(path coll null-vector alpha-map)))
([coll origin alpha-map]
(let [null-vector (vec (repeat (count origin) 0))
unit-vector #(assoc null-vector (alpha-map %) 1)
sum-vectors #(vec (map + %1 %2))]
(reductions sum-vectors origin (map unit-vector coll)))))