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

将一个选项的元组转换为Scalaz或Shapeless的元组选项

发布时间:2020-12-16 09:15:20 所属栏目:安全 来源:网络整理
导读:有 (Some(1),Some(2)) 我期望得到 Some((1,2)) 并拥有 (Some(1),None) 我期望得到 None 解决方法 您可以使用Scalaz 7为元组提供Bitraverse实例,然后像往常一样进行序列化(但是使用Bisequence而不是序列): scala import scalaz._,std.option._,std.tuple._,s

(Some(1),Some(2))

我期望得到

Some((1,2))

并拥有

(Some(1),None)

我期望得到

None

解决方法

您可以使用Scalaz 7为元组提供Bitraverse实例,然后像往常一样进行序列化(但是使用Bisequence而不是序列):

scala> import scalaz._,std.option._,std.tuple._,syntax.bitraverse._
import scalaz._
import std.option._
import std.tuple._
import syntax.bitraverse._

scala> val p: (Option[Int],Option[String]) = (Some(1),Some("a"))
p: (Option[Int],Some(a))

scala> p.bisequence[Option,Int,String]
res0: Option[(Int,String)] = Some((1,a))

不幸的是,Scalaz 7目前需要类型注释.

在评论中,Yo Eight指出,类型注释在这里仍然是强制性的.我不知道他或她的推理是什么,但实际上很容易编写自己的包装器,它将提供任何适当类型的元组与一个比较方法,并且不需要类型注释:

import scalaz._,std.tuple._    

class BisequenceWrapper[F[_,_]: Bitraverse,G[_]: Applicative,A,B](
  v: F[G[A],G[B]]
) {
  def bisequence = implicitly[Bitraverse[F]].bisequence(v)
}

implicit def bisequenceWrap[F[_,G[B]]
) = new BisequenceWrapper(v)

现在(一些(1),一些(“a”)).

我不能想到一个很好的理由斯卡拉兹不会包括这样的东西.无论您是否要在此期间添加它是一个品味问题,但绝对没有任何理论上的障碍让编译器在这里进行打字.

(编辑:李大同)

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

    推荐文章
      热点阅读