elm 是否有 haskell like lens 或类似的东西?
Does elm have haskell like lens or something similar?
在haskell我用的是镜头库。榆树有类似的东西吗?
如果我有这个榆树数据结构,我怎么能把 3 添加到 test.a.b
.
test = {
a = {
b = 5
}
}
在haskell中我会写:test & a.b ~% (+3)
。
在haskell里面可以写makeLenses ''RecordName
自动生成镜头,elm有吗?
有点。它有 Focus 库。它会让你说这样的话:
Focus.update (a => b) ((+) 3) test
...向 test.a.b
添加三个。 spring 要注意它有两个缺点。首先是您必须手工制作镜片。这没什么大不了的。对于上面的 test
记录,要手动创建镜头(或焦点),您首先需要一个 getter 函数,这很简单:
.a
然后是映射函数,它可以将一个函数应用到 a
给定 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
调用。所以有点样板,不过也没什么大不了的,嵌套gets/sets/updates随心所欲
更大的限制是,你不能做棱镜。因此,如果您的路径中涉及 Maybe
,您将被阻止。返回以 long-long-longhand 方式进行嵌套更新。
为什么没有棱镜?因为他们需要更高种类的类型,而 Elm 没有这些。 (还没有?)
所以答案是肯定的和否定的。您可以拥有类似 Lens 的东西,但不要指望 Haskell 镜头的全部功能。
更新:看来我在最后一点上错了 - Monacle 提供棱镜。我不认为这是可能的。我的立场是正确的!
在haskell我用的是镜头库。榆树有类似的东西吗?
如果我有这个榆树数据结构,我怎么能把 3 添加到 test.a.b
.
test = {
a = {
b = 5
}
}
在haskell中我会写:test & a.b ~% (+3)
。
在haskell里面可以写makeLenses ''RecordName
自动生成镜头,elm有吗?
有点。它有 Focus 库。它会让你说这样的话:
Focus.update (a => b) ((+) 3) test
...向 test.a.b
添加三个。 spring 要注意它有两个缺点。首先是您必须手工制作镜片。这没什么大不了的。对于上面的 test
记录,要手动创建镜头(或焦点),您首先需要一个 getter 函数,这很简单:
.a
然后是映射函数,它可以将一个函数应用到 a
给定 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
调用。所以有点样板,不过也没什么大不了的,嵌套gets/sets/updates随心所欲
更大的限制是,你不能做棱镜。因此,如果您的路径中涉及 Maybe
,您将被阻止。返回以 long-long-longhand 方式进行嵌套更新。
为什么没有棱镜?因为他们需要更高种类的类型,而 Elm 没有这些。 (还没有?)
所以答案是肯定的和否定的。您可以拥有类似 Lens 的东西,但不要指望 Haskell 镜头的全部功能。
更新:看来我在最后一点上错了 - Monacle 提供棱镜。我不认为这是可能的。我的立场是正确的!