Multiplying x and 2 doesn't work. Scala version is 2.13.8.
import Integral.Implicits._
object hello {
def f[T:Integral](x: T): T = x * 2
val x: Int = 1
f(x)
}
type mismatch;
found : Int(2)
required: T
def f[T:Integral](x: T): T = x * 2
CodePudding user response:
You need to convert 2
into a T
.
Thankfully, the instance of the Integral
typeclass for T
(which is passed implicitly thanks to [T: Integral]
has a fromInt
method which can convert an Int
like 2
into a T
:
def f[T: Integral](x: T): T = {
val two = implicitly[Integral[T]].fromInt(2) // summons the typeclass instance
x * two
}
CodePudding user response:
Adding to what Levi mentioned, you'll need to import:
import scala.math.Integral.Implicits.infixIntegralOps
Still, you can simplify it to just:
def f[T: Integral](x: T): T = x * Integral[T].fromInt(2)
Taking advantage of the Integral
companion object's apply
method which takes an implicit of Integral[T]
and returns it. It's exactly what implicitly
does, only implicitly
is more generic.