Scala 中的叉积

2024-02-26

我想要一个二元运算符cross(叉积/笛卡尔积)在 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'), (1, 'bye'), (2, 'hello'), (2, 'world'), (2, 'bye'))

仅在 Scala 中执行此操作的最佳方法是什么(即不使用 scalaz 之类的东西)?


您可以使用隐式类和for-Scala 2.10 中的理解:

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")

And now:

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

在 2.10 之前这是可能的,只是不太简洁,因为您需要定义类和隐式转换方法。

你也可以这样写:

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

如果你想xs cross ys cross zs返回一个Tuple3,但是,您将需要大量样板或类似的库无形的 https://github.com/milessabin/shapeless.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中的叉积 的相关文章

随机推荐