Во втором примере ваши a
, b
переменные объявленного типа T
не могут быть преобразованы в String
, который является обязательным типом аргумента +
, выведенным из вашей программы (то есть view применяется к типу аргументов +
при отсутствии какой-либо другой информации).
В первом примере логический вывод может угадать правильную +
функцию для применения, учитывая еепринимает в качестве аргументов тип элементов списка, и, к счастью, вы упомянули в объявлении типа, что тип этих элементов Int
.Попробуйте набрать
"1"+2
1 + 2
... в REPL и посмотрите, что пытается сделать Scala.Затем прочитайте о views .
Теперь я предполагаю, что, используя указанный выше параметр типа T
, вы пытаетесь написать функцию, которая работает с any numericтипа, не так ли?В этом случае вы можете работать с чертой Numeric
.Я позволю вам прочитать о последствиях , прежде чем предложить следующее:
def matchList[T](ls: List[T])(implicit n:Numeric[T]): List[T] = {
import n.mkNumericOps
ls match {
case 1 :: rest => rest
case a :: b :: rest => (a + b) :: rest
case _ => ls
}}
Вы получите:
matchList(List(1,2,3))
res2: List[Int] = List(2, 3)
matchList(List(2,3,4))
res4: List[Int] = List(5, 4)
matchList(List(2.0,3.0,4.0))
res5: List[Double] = List(5.0, 4.0)