Использование неявного параметра типа Numeric[A], похоже, игнорируется

Будучи новичком в Scala, я играл с fold, reduce а также scan, Я хотел увидеть последовательность, в которой элементы передаются по параметру функции, и как собирался конечный результат. Так как я планировал использовать его в списках чисел и строк, я определил следующую вспомогательную функцию с параметром типа:

scala> def vizAdd[A](p1:A, p2:A):A = {
 |   val res:A = p1 + p2
 |   println( s" * ($p1, $p2) => $res" )
 |   res
 | }
<console>:8: error: type mismatch;
 found   : A
 required: String
       val res = p1 + p2
                      ^

После добавления с параметром универсального типа в Scala предлагается решение, в котором основное внимание уделяется тому факту, что для метода + должен работать числовой тип, поэтому добавление в метод неявного параметра типа Numeric[A] должно помочь. К несчастью:

scala> def vizAdd[A](p1:A, p2:A)(implicit n: Numeric[A]):A = {
 |   val res:A = p1 + p2
 |   println( s" * ($p1, $p2) => $res" )
 |   res
 | }
<console>:8: error: type mismatch;
 found   : A
 required: String
         val res:A = p1 + p2
                          ^

Синтаксис с [A:Numeric] вместо (implicit n: Numeric[A]) тоже не работает...

Компиляция одноэлементного объекта "GenericTest", как реализовано в упомянутом посте (код ниже), приводит к той же ошибке: "найдено: A, требуется: строка".

object GenericTest extends App {
  def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = x + y    
}

Что мне здесь не хватает?

Я использую Scala 2.11.5

1 ответ

Решение

Numeric черта имеет такие методы, как plus, timesи т. д., которые используются так:

def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = n.plus(x, y) 

То, что вы ищете, это неявное преобразование, которое обогащает A иметь инфиксные операции, такие как +, *и т. д. т. е. этот:

import scala.math.Numeric.Implicits.infixNumericOps

def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = x + y

Или больше с небольшим синтаксическим сахаром:

def func1[A: Numeric](x: A, y: A): A = x + y 
Другие вопросы по тегам