Scala-код, который работает в IntelliJ, не работает в Scala REPL - PullRequest
0 голосов
/ 25 октября 2018

Я вижу следующее, когда набираю этот однострочный текст в 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)
                                                                                                  ^

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

По какой-то причине ваш 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) 
}
0 голосов
/ 25 октября 2018

Вы должны выполнить импорт 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, поэтому сообщение об ошибке.

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