gpt4 book ai didi

scala - Scala 中的叉积

转载 作者:行者123 更新时间:2023-12-03 06:16:51 26 4
gpt4 key购买 nike

我想要一个二元运算符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")

现在:

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但是,您将需要大量样板或像 Shapeless 这样的库.

关于scala - Scala 中的叉积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14740199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com