2

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

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

3 回答 3

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

于 2013-06-14T13:48:43.380 回答
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.

于 2013-06-14T13:50:04.607 回答
1

我认为您的问题是f需要两个Double参数,但您试图将其传递给单个元组:f((1, 2))is different from f(1, 2).

将 f 的类型更改为((Double, Double) => Double),它应该可以工作。

于 2013-06-14T13:51:35.200 回答