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は、 は 2 つのパラメーターを取りDouble、 を返す関数Doubleです。fタイプ の引数を 1 つ渡して呼び出そうとしています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)最初から 2 番目に移動するか、署名を変更することができますf

于 2013-06-14T13:50:04.607 に答える