问题标签 [lenses]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2105 浏览

haskell - Combining lenses

Using a lens library I can apply a modification function to individual targets, like so:

How can I combine those individual lenses (_1 and _3) to be able to perform this update to both of the targets at once? I expect something in the spirit of the following:

0 投票
2 回答
917 浏览

haskell - 为什么我的数据类型需要一个 Monoid 实例才能使用这个镜头?

我在具有 SceneGraph 类型字段“_scene”的记录上使用下面的代码。我使用 makeLenses 为它创建了镜头。

我收到错误:

但我不明白为什么 SceneGraph 必须是 Monoid 的一个实例才能使用这个镜头。

0 投票
1 回答
214 浏览

haskell - 将吸气剂组合成一个折叠

本着以下问题的精神:

我现在正在寻找一种将多个Getter组合成一个Fold的方法,如下所示:

会导致:

但上面的代码实际上失败并显示以下消息:

那么我该如何实现呢?这可能吗?

0 投票
1 回答
391 浏览

haskell - 我可以使用一元动作从 Control.Lens 过滤折叠吗?

Control.Lens.Fold contains filtered,我可以在应用一些单子操作之前使用它来过滤列表。似乎没有对应的filteredM- 但有没有办法获得这种效果?

要清楚,说我有

我如何适用于for which返回actionM的每个元素?xspredMTrue

一个重要的限制是我想predM在第一次调用之前对所有调用进行排序actionM- 所以我需要一种方法来对列表进行两次传递。我不能仅仅将predMand组合actionM成一个函数。

0 投票
1 回答
228 浏览

haskell - 如何生成镜头列表?

我的代码中有一个通用模式,其中有一个对象列表,我将它们传递给一个函数choose让用户选择一个。

但是,返回 anInt是不幸的,因为现在我必须使用部分(!!)来访问所选元素。为避免这种情况,我宁愿拥有

我传入一个镜头列表,其中一个用于访问列表中的每个元素。然后,我可以确定使用修改镜头另一端的对象是安全的,而不用担心它是否真的存在。

我怎么能创建这样一个镜头列表?实际上,我需要

作为奖励,更一般的东西

也会很棒 - 为遍历访问的每个点制作一个镜头

0 投票
3 回答
3556 浏览

scala - 在 Scala 中合并两个案例类,但具有深度嵌套的类型,没有镜头样板

类似于这个案例类问题,但有一个转折:

我有一个案例类,它有一些深度嵌套的案例类作为属性。举个简单的例子,

我想将两个 FooBar 案例类合并在一起,获取输入存在的值并将它们应用于现有实例,生成更新版本:

我知道我可以使用镜头来组成深度嵌套的属性更新;但是,我觉得这需要大量的样板代码:我需要为每个属性使用一个镜头,并且在父类中需要另一个组合镜头。这似乎需要维护很多东西,即使在shapeless中使用更简洁的镜头创建方法也是如此。

棘手的部分是 optionFoo 元素:在这种情况下,两个元素都以 Some(value) 存在。但是,我想合并内部选项属性,而不仅仅是用 fb2 的新值覆盖 fb1。

我想知道是否有一种好的方法可以以需要最少代码的方式将这两个值合并在一起。我的直觉告诉我尝试使用unapply案例类上的方法返回一个元组,迭代并将元组组合成一个新的元组,然后将元组应用回一个案例类。

有没有更有效的方法来做到这一点?

0 投票
1 回答
551 浏览

haskell - 如何解决无法使用存在类型的镜头?

我第一次使用 Edward Kmett 的镜头库,发现它相当不错,但我遇到了障碍......

[1] 中的问题解释了存在量词破坏了 makeLenses。我真的很想以某种方式使用带有镜头的存在主义。

作为背景,我有课:

对于实际问题,我想要类型:

我希望能够写一些类似的东西:

由于 [1] 中解释的原因,这不起作用。如果我通过编译向 GHC 询问调试信息-ddump-splices,我会得到:

拼接本身是空白的,这向我表明它没有产生任何声明。这部分是我期待并理解的,因为我已经阅读了 [1]。

我想知道的是我该怎么做——我可以做些什么来解决这个问题?我可以做些什么来避免在这个上游游泳?我希望能够通过组合镜头的路径访问我的结构的任何部分,但是因为我有其他类型的字段,例如Set AnyFile,除非我可以使用AnyFile镜头访问 的内容,否则我不能这样做。

[1]存在量词悄悄地破坏了 Template Haskell (makeLenses)。为什么?

0 投票
2 回答
1408 浏览

java - 哪些语言支持 Lenses 或类似方式来更新不可变的嵌套结构?

虽然很多人都称赞不变性,但我发现在主流编程中很难维护。根据我的经验,程序员迟早会让字段再次可变,以避免重构必须将更新的对象与返回值一起传递的大段代码。

Scala 对复制构造函数有一些支持,但我知道更新复杂对象结构没有令人满意的解决方案。我可能错过了什么。

我尝试过的最好的实现是 Haskell 中的 data-lens。然而,Haskell 很难学。Java 或 Scala 等流行的跨平台编程语言有哪些选择?

0 投票
1 回答
792 浏览

haskell - 是否可以使用 Lenses 构建新记录?

如果我有一个带镜头的记录类型,是否可以在不使用底层记录访问器的情况下构造一个新记录?

可以创建Foo一个实例,Data.Default然后def使用镜头进行修改,但并非所有记录类型都有合理的默认值。Control.Lens 有自己的方法吗?

0 投票
3 回答
1105 浏览

list - 使用镜头插入到特定位置的列表中

我正在尝试对包含元素列表的嵌套数据结构进行操作。在尝试了各种方法后,我最终决定将镜头作为最好的方法。它们非常适合查找和修改结构的特定元素,但到目前为止,我对如何添加新元素感到困惑。

从我读过的内容来看,我不能在技术上使用遍历,因为它违反遍历定律将新元素插入到列表中,并且假设我什至可以首先弄清楚如何使用遍历来做到这一点(我对 Haskell 的使用仍然相当薄弱,并且镜头包中大多数东西的类型签名让我头晕目眩)。

具体来说,我想要完成的是,在与特定选择器匹配的元素列表中找到一些元素,然后在匹配的元素之前或之后插入一个新元素(在之前或之后的函数的不同参数匹配)。Control.Lens 是否已经有一些东西可以完成我正在尝试做的事情,并且我对类型签名的理解太弱以至于看不到它?有没有更好的方法来完成我想要做的事情?

如果我只是想在列表的开头或结尾添加一个新元素,那将是相当微不足道的,但是将它插入到中间的某个特定位置是困难的部分。在我编写的一些镜头前代码中,我使用折叠来完成我想要的,但它开始在结构的更深嵌套部分变得粗糙(例如折叠内的折叠内的折叠)所以我转向 Control.Lens 试图解开一些混乱。