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 提供棱镜。我不认为这是可能的。我的立场是正确的!