私は Haskell でScrap Your Boilerplateという興味深いライブラリを見つけました。これはSimon Peyton Jonesの論文に基づいており、関数型プログラミング言語で大規模で深くネストされたデータ構造を更新できるコードを効率的に作成する方法のようです。次のようなコードを有効にします。
incS :: Float -> Salary -> Salary
incS k (S s) = S (s * (1+k))
increase :: Float -> Company -> Company
increase k = everywhere (mkT (incS k))
これにより、大規模で複雑になる可能性のある会社のデータ構造内のすべての人に対して、一定の割合 k で給与が効果的に増加します。
Clojure で同じ種類のプログラミング スタイルを実現する同等のライブラリまたはアプローチはありますか?
たとえば、上で使用した例に相当する Clojure をどのように記述すればよいでしょうか。
(defn increase [company k]
(everywhere-in company (transform-map-values :salary #(* % (+ 1 k))))