mik*_*era 11 generics haskell clojure boilerplate scrap-your-boilerplate
我在Haskell中找到了一个有趣的库,它基于Simon Peyton Jones的论文,称为Scrap Your Boilerplate,它似乎是编写可以在函数式编程语言中更新大型深度嵌套数据结构的代码的有效方法.它使代码如下:
incS :: Float -> Salary -> Salary
incS k (S s) = S (s * (1+k))
increase :: Float -> Company -> Company
increase k = everywhere (mkT (incS k))
Run Code Online (Sandbox Code Playgroud)
在一个潜在的庞大而复杂的公司数据结构中,每个人都有效地增加了固定比例k的工资.
在Clojure中是否有相同的库或方法来实现相同类型的编程风格?
例如,我如何编写上面使用的示例的Clojure等价物:
(defn increase [company k]
(everywhere-in company (transform-map-values :salary #(* % (+ 1 k))))
Run Code Online (Sandbox Code Playgroud)
Clojure 中与此最接近的可能是“in”函数(assoc-in、update-in、dissoc-in)。
这些函数允许您在 clojure 中进行深度嵌套、精确的更改。Haskell 中没有与这些函数等效的函数,因为它们严重依赖动态类型。