Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scalaz:如何用值镜头组合贴图镜头?_Scala_Map_Scalaz_Lenses_Scalaz7 - Fatal编程技术网

Scalaz:如何用值镜头组合贴图镜头?

Scalaz:如何用值镜头组合贴图镜头?,scala,map,scalaz,lenses,scalaz7,Scala,Map,Scalaz,Lenses,Scalaz7,有一个Scalaz地图镜头的例子:Dan Burton称之为containsKey,它的灵感来自Edward Kmett的演讲。Scalaz 7中还有一种称为mapVPLens的东西,用于修改地图中的值 我的问题是:如果我有一个镜头用于修改类型V,还有一个镜头用于映射[K,V],我如何组合它们?我一直在寻找一个好的简单示例,但Scalaz中仍然缺少示例 我对Scalaz 6和Scalaz 7解决方案都感兴趣。如果您试图用贴图镜头合成的镜头是部分镜头,您可以使用合成: import scalaz.

有一个Scalaz地图镜头的例子:Dan Burton称之为containsKey,它的灵感来自Edward Kmett的演讲。Scalaz 7中还有一种称为
mapVPLens
的东西,用于修改地图中的值

我的问题是:如果我有一个镜头用于修改类型
V
,还有一个镜头用于
映射[K,V]
,我如何组合它们?我一直在寻找一个好的简单示例,但Scalaz中仍然缺少示例


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

如果您试图用贴图镜头合成的镜头是部分镜头,您可以使用
合成

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
方法。

谢谢,这是一个很好的答案。我终于让镜头合成与我的应用程序一起工作了——大量的编译时争论,没有运行时争论!总之,技巧是在处理地图时将
.partial
添加到值镜头。