11

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

2 回答 2

4

Clojure 中与此最接近的可能是“in”函数(assoc-in、update-in、dissoc-in)。

这些函数允许您在 clojure 中进行深度嵌套、精确的更改。Haskell 中没有与这些函数等效的函数,因为它们严重依赖动态类型。

于 2011-09-12T15:41:23.560 回答
1

当第一次提出这个问题时,他们并不在身边,但我相信传感器可以实现类似的编程风格。基本上可转换过程实现了一组特定的功能,转换器可以使用这些函数遍历任何可转换过程。

于 2015-01-30T21:04:18.840 回答