榆树有像镜头一样的类似物吗?

时间:2016-07-02 15:28:56

标签: elm

在haskell我使用镜头库。榆树有类似的东西吗? 如果我有这个elm数据结构,我怎么能向test.a.b添加3。

test = {
  a = {
    b = 5
  }
 }

在haskell中,我会写:test & a.b ~% (+3)。 在haskell我可以写makeLenses ''RecordName并自动生成镜头,榆树有吗?

1 个答案:

答案 0 :(得分:5)

排序。它有Focus库。它可以让你说出类似的东西:

Focus.update (a => b) ((+) 3) test

...将{3}添加到test.a.b。它有两个缺点,让人想起。首先,你必须手工制作镜片。这不是什么大问题。对于上面的test记录,要手动创建镜头(或焦点),首先需要一个getter函数,这很简单:

.a

然后是一个map函数,它可以将函数应用于给定a的{​​{1}}:

test

现在,您可以将这两者结合起来进行聚焦:

\f test = { test | a = f test.a }

a = Focus.create .a (\f test = { test | a = f test.a }) 执行相同的操作:

b

现在,您可以将这两个焦点与b = Focus.create .b (\f a = { a | b = f a.b }) 结合使用,这样您就可以进行上面显示的(a => b)调用了。所以有一些样板,但它并没有太大的困难,你可以对你内心的内容进行嵌套的获取/设置/更新。

更大的限制是,你不能做棱镜。因此,如果您的路径中涉及Focus.update,则会被阻止。回到嵌套更新的长期漫长的方式。

为什么没有棱镜?因为他们需要更高的kinded类型,而Elm没有那些。 (然而?)

所以答案是肯定的&没有。你可以拥有镜头般的东西,但不要指望Haskell镜头的全部功能。

更新:在我的最后一点上看起来我错了 - Monacle提供了棱镜。我认为不可能。我纠正了!