在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的库。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容