Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Clojure相当于Haskell';s";“扔掉你的样板”;(SYB)_Generics_Haskell_Clojure_Boilerplate_Scrap Your Boilerplate - Fatal编程技术网

Generics Clojure相当于Haskell';s";“扔掉你的样板”;(SYB)

Generics Clojure相当于Haskell';s";“扔掉你的样板”;(SYB),generics,haskell,clojure,boilerplate,scrap-your-boilerplate,Generics,Haskell,Clojure,Boilerplate,Scrap Your Boilerplate,我在Haskell中发现了一个有趣的库,名为“基于”,它似乎是编写代码的有效方法,可以在函数式编程语言中更新大型、深度嵌套的数据结构。它支持以下代码: incS :: Float -> Salary -> Salary incS k (S s) = S (s * (1+k)) increase :: Float -> Company -> Company increase k = everywhere (mkT (incS k)) 在一个潜在的大型和复杂的公司数据结构

我在Haskell中发现了一个有趣的库,名为“基于”,它似乎是编写代码的有效方法,可以在函数式编程语言中更新大型、深度嵌套的数据结构。它支持以下代码:

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

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


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

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

SYB论文是合著者拉尔夫·勒梅尔(Ralf Lämmel)与(不同的)合著者约斯特·维瑟(Joost Visser)在哈斯凯尔嵌入Stratego的工作的延续。要更新Clojure中的嵌套结构,您需要的是SYB的“遍历控制”端,而不是其数据类型泛型端,因此您可以将问题扩大到询问是否有人在Clojure中嵌入了Stratego。我不知道Clojure,一点网络搜索似乎表明还没有人这么做。当然,在Scheme中嵌入了Stratego遍历,这应该比SYB更容易移植,我自己也写了一个。我不知道SYB,但也许这就是你们想要的?