问题标签 [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 投票
2 回答
1450 浏览

scala - 如何使用单片眼镜更新地图

我想试试Monocle库。但我找不到基本语法的帮助资源。

简而言之,我需要Map[K,V] -> A具有光学特性的光学器件V -> A,我该如何定义?

假设我有一些

接下来我遇到了我需要简单的地方StateStore => StateStore,所以我正在导入

并尝试首先定义:

到达这里

模棱两可的隐含值​​:类型的方法和类型的atMap方法都 匹配预期 类型 trait MapInstances[K, V]=> monocle.function.At[Map[K,V],K,V]atSettrait SetInstances[A]=> monocle.function.At[Set[A],A,Unit]monocle.function.At[S,Path,A]

试图将我的定义更改为

现在得到:

类型不匹配; found : monocle.function.Index[Map[Path,Nothing],Path,Nothing] (展开为) monocle.function.Index[Map[List[String],Nothing],List[String],Nothing] required: monocle.function.Index[Map[Path,Nothing],Path,A] (展开为)monocle.function.Index[Map[List[String],Nothing],List[String],A]

注意: Nothing <: A, 但trait Index类型不变A。您可能希望改为定义A+A。(SLS 4.5)

0 投票
3 回答
1224 浏览

scala - 如何在嵌套案例类中查找和修改字段?

List定义了一些带有字段的嵌套案例类:

和一个样本workspace

现在我想写一个这样的方法,它添加一个新version的 a doc

我将按如下方式使用:

我不确定如何以优雅的方式实现它。我试过monocle,但它没有提供filteror find。我尴尬的解决方案是:

有没有更好的解决方案?(可以使用任何库,不仅如此monocle

0 投票
1 回答
893 浏览

scala - 高效优雅地从案例类结构列表中删除元素

我有一个嵌套case类结构List

为简单起见,将使用以下示例 -

说有List[Department]List[Department]现在,如果我想通过过滤Address每个Person没有特定zipCode值的内容来创建一个新的;传统上我们可以做以下

这种方法性能不高,因为取决于嵌套级别,它可以是 Big O(n^2) 或 Big O(n^3) ;

我正在尝试通过Monocle学习镜头。到目前为止,我所了解到的是,当您必须“修改”深度嵌套的case类结构但尚未找到一种方法来根据条件“切断”嵌套结构的某些部分并返回新结构时,Lenses 很有用。这可能通过 Monocle 实现吗?另外我不确定 Lenses 是否也能帮助实现更好的 Big O 时间?

0 投票
1 回答
203 浏览

scala - 如何使用 Monocle 的内置法律实现来测试我自己的镜头?

我注意到 Monocle 实现了用于测试库内部的镜头定律。它们似乎很好地概括和模块化。我试图用它们来测试我自己的镜头,但我迷失在依赖丛林中。有没有人尝试过这样做,并可以发布一个例子?该文件似乎根本没有谈论法律。谢谢你。

详细地说,这是我正在尝试做的事情(摸索,不确定我是否使用预期的方式来使用 API):

其中 l 是 Monocle 镜头,在范围内可见。我收到以下错误消息:

据我所见,setGet 法则构造了一个 IsEq 对象,但我无法找到如何将其转换为 Prop(或布尔值)。

我还可以看到该框架正在使用函数 checkAll 来同时测试所有 LensLaws,但我也无法让它在我自己的代码中工作。任何帮助表示赞赏。

0 投票
1 回答
803 浏览

scala - Monocle 的 Optionals 是否与局部 Lenses 相同?

Monocle 的可选项具有以下访问功能(对于Optional[C,A]):

这与(部分)非对称数据镜头的原始定义不一致。我希望:

这是什么原因?如何使用 Monocle 获得经典的局部镜片?在对镜头进行编程时,我发现确保设置的整体性比确保获得的整体性要困难得多......

0 投票
1 回答
172 浏览

scala - 通过“镜头”映射“状态”

是否有一些带有签名的功能

使用语义对所选部分进行修改并获得结果

一种实现可能是

但是如果有更直接的方法使用单片眼镜scalaz.Lens

0 投票
2 回答
682 浏览

scala - Scala: how to upsert field value in Monocle

Given the JsonExample in the monocle project, I would like to create a lens where a set call will either replace a value in a key/value pair, or create the key/value pair if it doesnt already exist.

However this seems to represented with either an index (which can compose type safe) or an at, which does not type safe

Is what I am after possible?
Also could I extend it, such that if age was nested in another JsObject, for example:

Where the key/value pair for "nested" didnt yet exist, that it would create the object at nested and then add the field

0 投票
1 回答
858 浏览

scala - 具有错误处理功能的镜头/棱镜

假设我有一对转换函数

我可以使用光学很容易地表示这些。

stringIntPrism :: Prism String Int

但是,如果我想表示失败原因,我需要将它们保留为两个单独的函数。

因为这个简单的例子Maybe非常好,因为我们总是可以假设失败是解析失败,因此我们实际上不必使用 Either 或 Validation 类型对其进行编码。

但是想象一下,除了解析 Prism 之外,我还想执行一些验证

能够将这些东西组合在一起是理想的,这样我就可以拥有

ageField = isUnder55 . isOver18 . string2Int :: ValidationPrism [e] String Int

这对于手工构建来说相当简单,但它似乎是一个足够普遍的概念,在镜头/光学领域可能已经潜伏着一些东西可以做到这一点。是否存在处理此问题的现有抽象?

tl;博士

是否有实现部分镜头/棱镜/iso的标准方法,可以通过任意函子进行参数化,而不是直接绑定到Maybe?

我在上面使用了 Haskell 表示法,因为它更直接,但是我实际上是在 Scala 中使用 Monocle 来实现它。但是,我会对特定于 ie ekmett 的 Lens 库的答案感到非常满意。

0 投票
1 回答
446 浏览

scala - 通过 Monocle 修改地图

我想尝试镜头,Monocle 库似乎(从我的菜鸟的角度来看)与所有那些花哨的无样板文件都很好@Lenses。不幸的是,我发现对于初学者来说几乎没有学习材料(我知道香草 Scala 中的 FP 基础知识,没有 Scalaz)。官方教程缺乏简单的示例(和/或其结果),并且混合了相当复杂的 Scalaz 库。有人会假设像访问地图这样的琐碎任务将在第一页上介绍。

我有以下片段:

我看到了atand index,但没有简单的例子(只是一些奇怪的 [我的魔法] 答案applyOptional需要样板文件)。我想更新地图housesTown我本着这种精神尝试了一些事情:

这在语法上是错误的,但我认为我想做的事情很明显(presentsDeliveredHouse指定x, y坐标处修改)。所以我的问题是,如何修改index部分以访问地图

欢迎任何帮助、线索或对新手友好的学习材料提示。

0 投票
2 回答
1924 浏览

scala - 在 Scala 的 Monocle 中过滤列表

给定以下代码:

我如何从选择中“过滤”出某些 Persons,而不是按索引,而是按 的特定属性Person,例如:

我只找到了这个filterIndex函数,它只包含基于索引的列表中的元素,但这不是我想要的。

filterIndex接受一个类型的函数:(Int => Boolean)

而且我要:

filterWith(组成名称),它采用 a (x => Boolean),其中 x 具有列表元素的类型,即Person在这个简短的示例中。

这似乎如此实用和普遍,以至于我认为有人已经考虑过这一点,而我(我必须承认对此事的理解有限)不明白为什么不能这样做。

我是否缺少此功能,是否尚未实现或出于某种原因显然不可能(如果您有时间,请解释一下)?

谢谢你。