gpt4 book ai didi

scalaz - 链接 Scalaz 镜头组操作

转载 作者:行者123 更新时间:2023-12-02 10:53:38 25 4
gpt4 key购买 nike

我正在尝试学习 scalaz7 镜头。有没有更好的方法来链接集合操作?

case class Outer(left: Inner, right: Inner)
case class Inner(top: Int, bottom: Int)

val left = Lens.lensu[Outer, Inner](
(o,v) => o.copy(left = v),
_.left
)
val right = Lens.lensu[Outer, Inner](
(o,v) => o.copy(right = v),
_.right
)
val top = Lens.lensu[Inner, Int](
(o,v) => o.copy(top = v),
_.top
)

val leftTop = left >=> top
val rightTop = right >=> top

val outer0 = Outer(Inner(10,20), Inner(30, 40))
val outer1 = rightTop.set(leftTop.set(outer0, 11), 33)

更新:

我有一种感觉,答案可能是使用状态单子(monad),尽管我几乎不明白为什么这似乎有效。有兴趣知道是否有更简洁的方法。

val modifier = for{
_ <- leftTop := 11
_ <- rightTop := 33
} yield Unit

modifier(outer0)._1 // = Outer(Inner(11,20),Inner(33,40))

最佳答案

您可以稍微简化 State monad 版本:

(leftTop := 11) >> (rightTop := 33) exec outer0

或者,如果您愿意的话:

val modifier = (leftTop := 11) >> (rightTop := 33)
modifier.exec(outer0)

你原来的状态版本看起来有点奇怪,因为 <-for语句只是调用 .flatMap 的语法糖。 。稍微简化一下,结果是 leftTop := 11类型如 State[Outer, Outer, Int] ,大致相当于 Outer => (Outer, Int) 类型的函数。状态跟踪 Outer结果的一部分并通过 Int部分为.flatMap 。既然你不关心 Int结果,您将其分配给 _并忽略它。

>>做同样的事情,它是 .flatMap忽略它的参数并且与编写相同:

(leftTop := 11) flatMap (_ => rightTop := 33)

其结果是一个状态计算,它有一个辅助函数 .exec以初始状态 ( outer0 ) 运行计算并返回最终状态(丢弃任何结果)。

如果您想避免使用 State,您几乎必须按照开始的方式进行操作。 State 的全部意义在于在步骤之间传递中间结果而不明确提及它们。

关于scalaz - 链接 Scalaz 镜头组操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20599288/

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