11 Stimmen

Clojure-Äquivalent von Haskell's "Scrap Your Boilerplate" (SYB)

Ich habe eine interessante Bibliothek in Haskell namens Scrap Your Boilerplate entdeckt, die auf einem Paper von Simon Peyton Jones basiert und anscheinend eine effektive Möglichkeit bietet, Code zu schreiben, der große, tief verschachtelte Datenstrukturen in einer funktionalen Programmiersprache aktualisieren kann. Es ermöglicht Code wie:

incS :: Float -> Salary -> Salary
incS k (S s) = S (s * (1+k))

increase :: Float -> Company -> Company
increase k = everywhere (mkT (incS k))

Was effektiv das Gehalt um einen festen Anteil k für jeden in einer potenziell großen und komplexen Firmen-Datenstruktur erhöht.

Gibt es eine äquivalente Bibliothek oder einen Ansatz, um denselben Programmierstil in Clojure zu erreichen?

Zum Beispiel, wie könnte ich das Clojure-Äquivalent des oben verwendeten Beispiels schreiben:

(defn increase [company k]
  (everywhere-in company (transform-map-values :salary #(* % (+ 1 k))))

4voto

Conrad Barski Punkte 188

Das Ähnlichste dazu in Clojure sind wahrscheinlich die "in" Funktionen (assoc-in, update-in, dissoc-in).

Mit diesen Funktionen können Sie tief verschachtelte, punktgenaue Änderungen in Clojure vornehmen. In Haskell gibt es keine Äquivalente zu diesen Funktionen, da sie stark auf dynamische Typisierung angewiesen sind.

1voto

Karl Bielefeldt Punkte 45032

Sie waren nicht da, als diese Frage zum ersten Mal gestellt wurde, aber ich glaube, dass Transducers eine ähnliche Art des Programmierens ermöglichen. Grundsätzlich implementieren transducerble Prozesse eine bestimmte Reihe von Funktionen, die Transducers verwenden können, um über jeden transducerbaren Prozess zu traversieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X