我在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))))