Scala怪隐含拳击转换错误

时间:2013-06-14 13:39:39

标签: scala boxing lifting

有人能告诉我为什么以下不起作用吗?

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)) => ?

3 个答案:

答案 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),它应该有效。