最简洁的方法来组合序列元素

时间:2011-08-15 16:59:44

标签: scala functional-programming

假设我们有两个序列,我们希望使用某种方法将它们组合起来

val a = Vector(1,2,3)
val b = Vector(4,5,6)

例如,添加可以是

val c = a zip b map { i => i._1 + i._2 }

val c = a zip b map { case (i, j) => i + j }

第二部分的重复让我觉得这应该可以在一次操作中完成。我看不到任何内置的方法。我想我真正想要的是一种跳过元组创建和提取的zip方法。

Scala中是否有更漂亮/更简洁的方式,或者Scalaz?如果没有,你会如何编写这样的方法并将其移植到序列上,这样我就可以编写类似

的内容
val c = a zipmap b (_+_)

2 个答案:

答案 0 :(得分:12)

(a,b).zipped.map(_ + _)

这可能足够接近您想要不打扰扩展的内容。 (不幸的是,你不能无点使用它,因为zipped上的暗示不喜欢它。)

答案 1 :(得分:2)

Rexanswer肯定是大多数案例的更简单方法。但是,zippedzip更受限制,因此您可能会遇到不起作用的情况。

对于这些情况,您可以尝试这样做:

val c = a zip b map (Function tupled (_+_))

或者,或者,如果你有一个功能或方法可以做你想要的,你也有这个选项:

def sumFunction = (a: Int, b: Int) => a + b
def sumMethod(a: Int, b: Int) = a + b

val c1 = a zip b map sumFunction.tupled
val c2 = a zip b map (sumMethod _).tupled

使用.tupled在第一种情况下不起作用,因为Scala无法推断出函数的类型。