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

在Scala的交叉产品

发布时间:2020-12-16 09:48:23 所属栏目:安全 来源:网络整理
导读:我想有一个二叉运算符交叉(交叉乘积/笛卡尔乘积)与Scala中的遍历操作: val x = Seq(1,2)val y = List('hello','world','bye')val z = x cross y # i can chain as many traversables e.g. x cross y cross w etcassert z == ((1,'hello'),(1,'world'),'bye'
我想有一个二叉运算符交叉(交叉乘积/笛卡尔乘积)与Scala中的遍历操作:

val x = Seq(1,2)
val y = List('hello','world','bye')
val z = x cross y    # i can chain as many traversables e.g. x cross y cross w etc

assert z == ((1,'hello'),(1,'world'),'bye'),(2,'bye'))

什么是最好的方法,只在Scala(即不使用像scalaz)?

解决方法

你可以在Scala 2.10中使用一个隐式类和一个for-comprehension直接做到这一点:

implicit class Crossable[X](xs: Traversable[X]) {
  def cross[Y](ys: Traversable[Y]) = for { x <- xs; y <- ys } yield (x,y)
}

val xs = Seq(1,2)
val ys = List("hello","world","bye")

现在:

scala> xs cross ys
res0: Traversable[(Int,String)] = List((1,hello),world),...

这在2.10之前是可能的 – 只是不那么简洁,因为你需要定义类和一个隐式转换方法。

你也可以这样写:

scala> xs cross ys cross List('a,'b)
res2: Traversable[((Int,String),Symbol)] = List(((1,'a),...

如果你想要xs交叉ys交叉zs返回一个Tuple3,但是,你需要很多样板或像Shapeless的库。

(编辑:李大同)

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

    推荐文章
      热点阅读