在haskell我使用镜头库。榆树有类似的东西吗?
如果我有这个elm数据结构,我怎么能向test.a.b
添加3。
test = {
a = {
b = 5
}
}
在haskell中,我会写:test & a.b ~% (+3)
。
在haskell我可以写makeLenses ''RecordName
并自动生成镜头,榆树有吗?
答案 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提供了棱镜。我认为不可能。我纠正了!