gpt4 book ai didi

scala - 通过 Monocle 修改 map

转载 作者:行者123 更新时间:2023-12-04 17:33:25 26 4
gpt4 key购买 nike

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

我有以下片段:

  @Lenses case class House(presentsDelivered: Int)

type Houses = Map[(Int, Int), House]

@Lenses case class Town(houses: Houses)

@Lenses case class Santa(x: Int, y: Int)

@Lenses case class World(santa: Santa, town: Town)

我看到了 atindex ,但没有简单的例子(只是一些奇怪的 [我的魔法] 回答 applyOptional 需要样板)。我要更新 map - housesTown .我正在本着这种精神尝试一些事情:
(World.town ^|-> Town.houses ^|-> index((x, y)) ^|-> House.presentsDelivered)
.modify { _ + 1 }(world)

这在语法上是错误的,但我认为我想要做的很明显(在指定的 presentsDelivered 坐标处修改 Housex, y )。所以我的问题是, 如何修改index部分访问 map ?

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

最佳答案

从字面上看,您离解决方案仅一个字符(可能是导入):

import monocle.function.all.index
import monocle.std.map._

(
World.town ^|->
Town.houses ^|-?
index((0, 0)) ^|->
House.presentsDelivered
).modify(_ + 1)

请注意,我已经替换了 ^|->紧接在索引前面的 ^|-? .这是必要的,因为 index((x, y))World.town有着根本的区别以及其他为案例类成员生成的微距镜头。那些不能不指向一个值,而 index如果 map 中给定索引处没有值,则可能会失败。在单片眼镜的类型方面, index((x, y))Optional[Houses, House] , 而 World.townLens[World, Town] .

选件在某种意义上比镜头弱,一旦你用选件组合了一个镜头,即使你组合了更多的镜头,你也会继续拥有选件。所以下面是一个镜头:
World.town ^|-> Town.houses

但这是一个可选的:
World.town ^|-> Town.houses ^|-? index((0, 0)) ^|-> House.presentsDelivered

Monocle 一直使用 x ^|-> y组成不同类型的 x (镜头、选项、遍历等)与镜头,以及 x ^|-? y组成不同的 x s 带有选项。我个人觉得运营商有点困惑,更喜欢 composeLens , composeOptional等,但口味各不相同,如果您想记住运算符,您至少可以确信它们一直被使用——您只需要知道给定类型需要哪一个。

你的代码的另一个潜在问题是你不能只写这个:
import monocle.function.all.index

val houses: monocle.Optional[Houses, House] = index((0, 0))

这不会自行编译,因为 index需要 Index 的实例type 用于索引类型的类(在本例中为 Map[(Int, Int), House] 。Monocle 为可以工作的 map 提供了一个通用实例,但您必须导入它:
import monocle.std.map._

恐怕我对学习 Material 没有任何非常好的建议,但是您可以随时在这里提问,还有 Monocle Gitter channel相当活跃。

关于scala - 通过 Monocle 修改 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34184107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com