如何使用zip和map在scala中创建zipwith函数到Array

时间:2018-02-09 02:58:25

标签: scala

我尝试使用zipmap创建zipwith功能,如:

def zipWithArray(f : (Int, Int) => Int)(xs : Array[Int], ys: Array[Int]) : Array[Int] = xs zip ys map f

但是我收到了以下编译错误:

type mismatch;
 found   : (Int, Int) => Int
 required: ((Int, Int)) => ? 

我知道zip(Array[Int], Array[Int])=>Array((Int, Int)),因此f应为(Int, Int) => Int,总结果为Array[Int]。请有人帮忙解释一下这个案子。非常感谢。

3 个答案:

答案 0 :(得分:3)

(Int, Int) => Int是一个以Int为参数的函数。 ((Int, Int)) => ?是一个函数,它接受一个由两个Int组成的元组作为参数。

由于xs zip ys是元组数组,所需要的是将元组作为参数并返回Int的函数。

所以xz zip ys map f.tupled应该有用。

参考:How to apply a function to a tuple?

答案 1 :(得分:0)

这就像错误信息所述;将您的功能签名更改为:

def zipWithArray(f : ((Int, Int)) => Int)(xs : Array[Int], ys: Array[Int]) 

如果没有额外的括号,f看起来像一个带有两个整数的函数,而不是一个带元组的函数。

答案 2 :(得分:0)

将函数转换为接受参数作为元组,然后map可用于调用函数。 例如:

scala> def add(a : Int, b: Int) : Int = a + b
add: (a: Int, b: Int)Int

scala> val addTuple = add _ tupled
<console>:12: warning: postfix operator tupled should be enabled
by making the implicit value scala.language.postfixOps visible.
This can be achieved by adding the import clause 'import scala.language.postfixOps'
or by setting the compiler option -language:postfixOps.
See the Scaladoc for value scala.language.postfixOps for a discussion
why the feature should be explicitly enabled.
       val addTuple = add _ tupled
                            ^
addTuple: ((Int, Int)) => Int = scala.Function2$$Lambda$224/1945604815@63f855b

scala> val array = Array((1, 2), (3, 4), (5, 6))
array: Array[(Int, Int)] = Array((1,2), (3,4), (5,6))

scala> val addArray = array.map(addTuple)
addArray: Array[Int] = Array(3, 7, 11)