问题标签 [monocle-scala]

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 投票
1 回答
268 浏览

monocle-scala - 添加和删​​除列表项

大学示例解释了如何添加和删除地图项:

但是,这不适用于列表:

添加什么都不做,删除会引发编译错误。

编辑:到目前为止,我使用quicklens,它能够修改序列。

0 投票
0 回答
467 浏览

json - 有没有办法将 circe-optics 的 JsonPath 与字符串一起使用,就像在 jq CLI 工具中一样?

我想做的是将字段描述符定义为json 的field1.field2[1].field3访问值:two

我知道我可以使用applyDynamicand来做到这一点root.field1.field2.index(1).field3,但是有没有办法使用字符串创建这样的镜头?

0 投票
1 回答
593 浏览

scala - 使用选项更新深度嵌套的案例类

我有一个 3 级嵌套案例类模型,其中包含一组代表数据库中一些数据的选项。它本质上是:

我了解如何使用一些用于理解或链flatMap另一个 Option 对象中的 Scala Option 对象)从中获得深度嵌套的字段,并且我也了解如何使用镜头库对其进行更新,但我想弄清楚如何更新即使树中的某些东西是字段,并且如果它们尚不存在,它们也会None自动生成它们。Some

例如,我将如何处理我想添加到keys列表但用户尚未设置任何内容的情况settings?从某种意义上说,是否有可能自动创建一个Some(settings)字段和一个Some(keys)字段?

我知道如何通过大量模式匹配来做到这一点,但这似乎是错误的,因为 1. 代码向右漂移和 2. 不使用mapflatMap非常不使用选项。

这可以单独使用镜头库吗?我在这里读到这可能是不可能的:https ://github.com/julien-truffaut/Monocle/issues/215就 Monocle 而言,它无法更新Option一个None. 也许我需要以另一种方式考虑这个问题?

谢谢

0 投票
0 回答
261 浏览

scala - Scala - 将案例类的字段复制到另一个避免昂贵的镜头

我们目前正在使用 Lenses 在不同案例类之间复制字段。但是那些在性能方面是昂贵的,因为当有多个嵌套类时。

是否有替代使用 scala 的副本和 scala Monocle 的镜头的替代方案,在代码的可读性和性能之间有不同的权衡?

0 投票
1 回答
805 浏览

scala - 是否有“可选”的van Laarhoven表示

许多类型的光学器件都有 van Laarhoven 表示。

例如,Lens类型的 aLens s t a b 可以表示为:

类似地 aTraversal可以用类似的方式表示,将Functor约束交换为Applicative

一些光学框架,例如MonocleArrow定义了一个名为Optional.

在 Monocle 的光学层次结构 Optional中,介于LensTraversal

据我了解:如果 aTraversal就像 aLens可能有零到多个目标,那么 anOptional就像 aLens可能有零到一个目标。

在 Monocle 中,Optional定义为一对函数:

Monocle 源代码中的注释表明,它也可以表示Optional“越来越PLensPPrism

是否可以将 an 表示Optional为 van Laarhoven 函数?

0 投票
0 回答
104 浏览

scala - 单片眼镜。斯卡拉。如何处理递归数据?

考虑一个简单的案例:

如何使用 Monocle 更改任何深度?

如果它不存在并且有时更改名称,我想将一个新节点添加到列表子项中。但是任何深度。递归地。

0 投票
1 回答
113 浏览

scala - 如何创建带有序列的 Monocle 镜头?

我正在尝试创建一个带有嵌套案例类和序列的 Monocle 镜头。

最后一行编译失败。我正在使用 Monocle 1.5.0-cats。

PS:替换Seq[B]List[B]作品,但我的案例类是由使用序列的scalaxb生成的。

0 投票
1 回答
278 浏览

typescript - 函数式编程/光学概念,它采用部分对象并使用镜头和遍历返回“填充”对象?

编辑我正在使用monocle-ts,但是如果使用 monocle-ts 是不可能的(因为作者甚至说它只是 Scala 原始 Monocle 的部分端口)但是如果在另一个光学包中有任何语言的东西,我愿意将这些想法移植到 TypeScript。)

假设我有一个辅助类型Partial<A>,它表示一个记录,该记录具有类型的部分或全部,但没有非成员A。(所以如果A = { foo: number, bar: string }then Partial<A> = { foo?: number, bar?: string })(编辑这是 Typescript 的内置 Partial 实用程序类型。)

我从

假设我已经组合了一个镜头并遍历组合 ( composedTraversal) 以便它聚焦于 partialxsfromPartialState然后作为一个数组遍历它。这将是一个Traversal<PartialState, Partial<Child>>.

还假设我有一个declare const fn = (x:Partial<Child>):Partial<Child>然后我可以应用于fn所有孩子,composedTraversal.modify(fn)(partialState)这将产生一个新PartialStatefn应用于所有partialxs.

是否有一些概念可以让我“扩大”或“转换”这个遍历到不同的东西,以便我可以组成镜头和遍历并使用fillInTheGaps,这样我就可以传入PartialState并取回 a State

忽略我的语法是 TypeScript,我添加了 monocle-scala 标签,因为如果这个概念存在,我想它在 Monocle 库中,我可以将这些知识翻译到我正在使用的库中。

编辑激发这个问题的问题是我在 Redux 应用程序中有一个表单输入,用户输入数据但大多数不是必需的。INPUT 在编译时是未知的(它们是从 RESTful API 查询中重试的),所以我不能将模型表示为

相反,它表示为

我还可以从 RESTful 服务器获取默认模型。所以我将这些建模为Parent(来自服务器的Partial<Parent>内容)和(代表用户在应用程序中的输入)。

在进行一些计算之前,我需要为缺少的道具折叠默认值。这是我fillInTheGaps上面引用的函数。

希望通过我的代码中的类型来强制执行此操作,并且因为我已经编写了很多光学元件,所以重用其中的一些。实际上,我编写了一个镜头和遍历来对这些数据执行其他操作。myLens.compose(myTraversal).modify(fn)接受 aPartial<State>并返回 aPartial<State>但我希望将这些组合起来最终得到一个接受部分并返回整体的函数。

我显然可以只写const filler: (Partial<State>):State = myLens.compose(myTraversal).modify(fillInTheGaps)然后//@ts-ignore在它上面扔一个并且知道它会起作用,但这似乎,呃,脆弱。

0 投票
0 回答
68 浏览

scala - 如何将单片眼镜库添加到我的 scala 项目中?

我有一个使用 scala 插件的 scala 项目。我需要为一个项目使用这个单片眼镜库(https://www.optics.dev/Monocle/),但我只是不知道如何将它添加到我的项目中。对于 sbt 项目,应该有一个 build.sbt 文件,我可以在其中简单地放入如下内容:

这应该为我添加依赖项。但是,我不知道我应该如何在我当前的项目中执行此操作,并且在网上找不到任何线索,我可以下载的任何地方都没有.jar 文件。

我还尝试用这个东西链接到图书馆文档:

在此处输入图像描述

这没有用。我的目录结构如下所示:

在此处输入图像描述

0 投票
1 回答
51 浏览

scala - 将嵌套在元组内的列表的每个条目与元组的其他部分合并

我有一个元组列表(我们称之为L1),在这个元组_1中是一些带有数据的类,并且是一个带有其他数据的其他类_2的列表(我们称之为)。L2对于L1(即元组列表)的每个条目,我需要将每个条目L2与相应的_1. 我正在尝试构图,但卡住了。这是一个代码片段来演示我想要实现的目标:

我想做的是这样的:

我是否朝着正确的方向前进?我应该以某种方式尝试组合这两个镜头还是需要完全不同的东西?我也在我的项目中使用 Cats,但我对此很陌生,目前看不出它在这种情况下是否有用。