加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:49:22 所属栏目:安全 来源:网络整理
导读:有一个 Scalaz地图镜头 here的例子:Dan Burton称它为containsKey,它的灵感来自Edward Kmett的演讲. Scalaz 7中还有一些名为mapVPLens的东西,可用于修改地图中的值. 我的问题是:如果我有一个用于修改V型的镜头和一个用于Map [K,V]的镜头,我该如何组合它们?
有一个 Scalaz地图镜头 here的例子:Dan Burton称它为containsKey,它的灵感来自Edward Kmett的演讲. Scalaz 7中还有一些名为mapVPLens的东西,可用于修改地图中的值.

我的问题是:如果我有一个用于修改V型的镜头和一个用于Map [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,A]

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读