有人能告诉我为什么以下不起作用吗?
object TestObject {
def map(f: (Double, Double) => Double, x2: Array[Double]) = {
val y = x2.zip( x2 )
val z = y.map(f)
z
}
}
产生此错误:
type mismatch; found : (Double, Double) => Double required: ((Double, Double)) => ?
答案 0 :(得分:4)
在此代码段中,f
是一个函数,它接受两个Double
参数并返回Double
。
您试图通过传递f
类型的单个参数来调用Tuple2[Double,Double]
。
您可以通过首先更改f
的类型来解决此问题:
object TestObject {
def map(f: ((Double, Double)) => Double, x2: Array[Double]) = {
val y = x2.zip( x2 )
val z = y.map(f)
z
}
}
您也可以将其声明为f: Tuple2[Double, Double] => Double
以使其更清晰(这完全等效)。
相反,你可以这样改变你的电话:
object TestObject {
def map(f: (Double, Double) => Double, x2: Array[Double]) = {
val y = x2.zip( x2 )
val z = y.map(f.tupled)
z
}
}
tupled
自动将(Double, Double) => Double
函数转换为Tuple2[Double, Double] => Double
函数。
但请注意,转换将在每次调用TestObject.map
答案 1 :(得分:2)
之间存在细微差别
f: (Double, Double) => Double // two Double arguments -> Double
和
f: ((Double, Double)) => Double // one Tuple2[Double, Double] argument -> Double
y
是一个Array[(Double, Double)]
,因此它需要一个采用元组并返回内容的方法,但上面定义的第一个f
与之匹配。
您可以y.map(f.tupled)
从第一个到第二个,或更改f
的签名。
答案 2 :(得分:1)
我认为您的问题是f
需要两个Double
个参数,但您尝试将其传递给一个元组:f((1, 2))
与f(1, 2)
不同。
将f的类型更改为((Double, Double) => Double)
,它应该有效。