我在Haskell中发现了一个基于Scrap Your Boilerplate的名为paper by 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))))
答案 0 :(得分:4)
Clojure中最接近它的可能是“in”函数(assoc-in,update-in,dissoc-in)。
这些功能允许您在clojure中进行深层嵌套,精确定位。在Haskell中没有与这些函数等价的东西,因为它们在很大程度上依赖于动态类型。
答案 1 :(得分:1)
在第一次提出这个问题时他们并没有,但我相信transducers能够实现类似的编程风格。基本上转换过程实现了一组功能,传感器可用于遍历任何可转换过程。