有一个Scalaz地图镜头here的例子:Dan Burton称之为containsKey
,它受到了Edward Kmett谈话的启发。 Scalaz 7中还有一些名为mapVPLens
的东西,可用于修改地图中的值。
我的问题是:如果我有修改类型V
的镜头和Map[K,V]
的镜头,我该如何构图?我一直在寻找一个简单的例子,但在Scalaz中仍然缺乏一些例子。
我对Scalaz 6和Scalaz 7解决方案感兴趣。
答案 0 :(得分:8)
如果您尝试使用地图镜头拍摄的镜头是部分镜头,则可以使用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
方法。