2015-04-01 3 views
1

У меня есть код SCALA следующимЛа Скала компилятор не может найти правильный общий параметр функции

object Main extends App { 
    def getFun[T, U](x: Array[T] => U, p: Array[T]): U = { x(p) } 
    def getFun2(x: Array[Int] => Double, p: Array[Int]): Double = { x(p) } 

    val arr = Array(1, 2, 3, 4) 
    println(getFun((x: Array[Int]) => x.sum, arr)) 
    // println(getFun(_.sum, arr)) // error, why! 
    // println(getFun(x = _.sum, arr)) // error, why! 
    println(getFun2(_.sum.toDouble, p = arr)) 
} 

Почему getFun не может быть использован как простой, как getFun2. Я думаю, что использовать «x = _.sum», компилятор scala может найти правильный тип, но кажется, что он потерпел неудачу.

Может ли какой-либо орган объяснить причину ошибки.
Спасибо!

ответ

2

getFun использует переменные типа, тогда как getFun2 использует явные типы.

Итак, для getFun2 компилятор знает, что он вызывает функцию sum на Array[Int]. Он знает, как подвести итог целым, все работает.

Для getFun компилятор знает, что есть массив что-то (T стендов для некоторых типов). Это не как подвести итог что-то, мы должны помочь компилятору здесь и рассказать ему, что такое T. Одна из возможностей - это то, что вы сделали в первой строке, указав тип массива в функции lambda. Другим было бы передать такие значения параметров типа, как это:

println(getFun[Int,Double](_.sum, arr)) 
+0

Хорошее объяснение, спасибо. – bourneli

Смежные вопросы