Неправильное использование Scala или Eclipse Bug с использованием Implicits - PullRequest
0 голосов
/ 20 января 2011

У меня есть класс, определенный ниже:

class NDArray[T](data: List[List[T]])(implicit num: Numeric[T])
 .....

У меня есть объект, который создает и возвращает новый NDArray:

object Foo
{
   def apply() =
   {
      new NDArray(List(List())
   }
}

Я получаю следующую ошибку: недостаточно аргументовдля конструктора NDArray: (неявное num: Numeric [A]) com.numscal.matrix.NDArray [A].Не указано значение параметра num.

Я пытался импортировать Numeric в объект, который создает NDArray, но это не работает.Мои модульные тесты для NDArray не импортируют Numeric и не имеют никаких проблем.

Я не совсем понимаю, что происходит.Есть идеи?

Ответы [ 2 ]

4 голосов
/ 20 января 2011

data - список списков типа T.Для конструктора NDArray требуется объект типа Numeric[T].Поскольку этот параметр объявлен implicit, это означает, что вам не нужно указывать его явно, когда компилятор может найти его в видимой области, которая также была определена как implicit.

Теперь,поскольку вы создаете экземпляр NDArray без указания T, компилятор выводит T.Он находит список списков и использует тип элемента внутреннего списка как T.Но так как вы не указали его, а список пуст, по умолчанию это List[Nothing], поэтому компилятор приходит к выводу, что T имеет тип Nothing.

Затем он ищетimplicit экземпляр Numeric[Nothing], но его не существует.

Есть несколько вещей, которые вы можете сделать.Либо:

new NDArray(List(List[Int]()))

Или:

new NDArray[Int](List(List()))

(Хотя я не уверен, что этот последний будет работать. Я не знаю, выведет ли компилятор параметр типавнутреннего списка правильно, вам просто нужно попробовать.)

Экземпляр implicit из Numeric[Int] уже импортирован по умолчанию, так как он является частью Predef.Вам не нужно импортировать это явно.То же самое относится ко всем примитивным числовым типам.

Я не знаю, хотите ли вы использовать список списков целых чисел, или чисел с плавающей точкой, или что-то еще.Компилятор также не знает, и не может вывести, потому что список, который вы дали, пуст.

2 голосов
/ 20 января 2011
scala> List(List())
res19: List[List[Nothing]] = List(List())

Не существует неявного числа для Nothing, используйте List.empty[List[TypeYouNeed]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...