Scalaz:如何使用超值镜头构图地图镜头?

Jam*_*abe 6 scala map scalaz lenses scalaz7

有一个Scalaz地图透镜的例子在这里:丹·伯顿调用它containsKey,并且它是由爱德华Kmett谈话的启发.mapVPLensScalaz 7中还有一些东西可用于修改地图中的值.

我的问题是:如果我有一个用于修改类型V的镜头和一个用于a的镜头Map[K,V],我该如何编写它们?我一直在寻找一个简单的例子,但在Scalaz中仍然缺乏一些例子.

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

Tra*_*own 8

如果您尝试使用地图镜头构图的镜头是部分镜头,您可以使用compose:

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

def headFoo[A] = listHeadPLens[A] compose mapVPLens("foo")
Run Code Online (Sandbox Code Playgroud)

然后:

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
Run Code Online (Sandbox Code Playgroud)

请注意,这是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)
Run Code Online (Sandbox Code Playgroud)

.partial如果你不喜欢一元运算符,还有一种方法.