Когда я набираю этот однострочный текст в REPL Scala, я вижу следующее, но он отлично работает в IntelliJ. Что здесь происходит?
scala> def sum[T: Numeric](seq: Seq[T]): T = if (seq.size == 1) seq.head else seq.head + sum(seq.tail)
<console>:12: error: type mismatch;
found : Seq[T]
required: Seq[String]
def sum[T: Numeric](seq: Seq[T]): T = if (seq.size == 1) seq.head else seq.head + sum(seq.tail)
^
Вы должны выполнить импорт import Numeric.Implicits._
для Scala, чтобы идентифицировать этот +
как дополнение к Numeric
. С импортом он работает и в консоли:
scala> import Numeric.Implicits._
import Numeric.Implicits._
scala> def sum[T: Numeric](seq: Seq[T]): T = if (seq.size == 1) seq.head else seq.head + sum(seq.tail)
sum: [T](seq: Seq[T])(implicit evidence$1: Numeric[T])T
Без импорта Scala пытается использовать метод +
, определенный в неявном классе Predef.any2stringadd
. Этот класс определен в Predef
, поэтому он автоматически импортируется в любой код Scala. Он преобразует первый аргумент любого типа в String
и ожидает, что вторым аргументом будет String
. В вашем случае это не String
, поэтому сообщение об ошибке.
По какой-то причине ваша Intellij-IDEA, похоже, игнорирует отсутствующий импорт неявных преобразований (это может быть поведение, указанное Intellij, или это может быть какой-то импорт, который вы пропустили в своем вопросе).
Здесь это работает в Scala REPL, а также сводит к минимуму объем неявных преобразований:
def sum[T](seq: Seq[T])(implicit num: Numeric[T]): T = {
import num._
if (seq.size == 1) seq.head else seq.head + sum(seq.tail)
}
@Frank Что такое "наоборот"? Приведенный выше фрагмент кода определенно работает в scala repl.
Да, мой не работал в REPL, потому что я неправильно импортировал num
. Это мой ответ. Колмар пришел к выводу, что я пропустил импорт num
.
Кроме того, конечно, в моем файле в IntelliJ я было правильно импортировал num
, но я забыл добавить это в REPL :-(
Наоборот - у меня это сработало в IntelliJ, но не в REPL.