我尝试使用zip
和map
创建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]
。请有人帮忙解释一下这个案子。非常感谢。
答案 0 :(得分:3)
(Int, Int) => Int
是一个以Int
为参数的函数。
((Int, Int)) => ?
是一个函数,它接受一个由两个Int
组成的元组作为参数。
由于xs zip ys
是元组数组,所需要的是将元组作为参数并返回Int
的函数。
所以xz zip ys map f.tupled
应该有用。
答案 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)