gpt4 book ai didi

Scalaz:如何用值镜头组合 map 镜头?

转载 作者:行者123 更新时间:2023-12-04 14:29:07 26 4
gpt4 key购买 nike

有一个 Scalaz map 镜头的例子 here :丹伯顿称之为 containsKey ,它的灵感来自 Edward Kmett 的演讲。还有一个叫mapVPLens的东西在 Scalaz 7 中,这对于修改 map 中的值很有用。

我的问题是:如果我有一个用于修改类型的镜头 V ,以及用于 Map[K,V] 的镜头,我怎样才能组成它们?我一直在寻找一个很好的简单示例,但 Scalaz 中仍然缺乏示例。

我对 Scalaz 6 和 Scalaz 7 解决方案都感兴趣。

最佳答案

如果您尝试与 map 镜头组合的镜头是部分镜头,则可以使用 compose :

import scalaz._, Scalaz._, PLens._

def headFoo[A] = listHeadPLens[A] compose mapVPLens("foo")

进而:
scala> headFoo.get(Map("foo" -> List(42)))
res0: Option[Int] = Some(42)

scala> headFoo.get(Map("foo" -> Nil))
res1: Option[Nothing] = None

scala> headFoo.get(Map("bar" -> List(13)))
res2: Option[Int] = None

请注意,这是 Scalaz 7。

如果您要构图的镜头不偏,可以使用 ~ 来构图。 :
scala> def firstFoo[A, B] = ~Lens.firstLens[A, B] compose mapVPLens("foo")
firstFoo: [A, B]=> scalaz.PLensFamily[Map[String,(A, B)],Map[String,(A, B)],A,A]

scala> firstFoo.get(Map("foo" -> (42, 'a)))
res6: Option[Int] = Some(42)

还有一个 .partial如果您不喜欢一元运算符,请使用此方法。

关于Scalaz:如何用值镜头组合 map 镜头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18835140/

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