我希望能够在Scala中定义以下函数:
import Numeric.Implicits._
def f[T:Numeric](a:T) = a*2
但我收到了错误
error: could not find implicit value for parameter num: scala.math.Numeric[Any]
def f[T:Numeric](a:T) = a*2
^
我可以使用隐式n:Numeric [T]参数和n.fromInt
来处理它,但可读性受到影响。 (我试图编写的真实代码比这更复杂。)
我尝试定义从Int到Numeric [T]的隐式转换:
implicit def intToNumericT[T](x:Int)(implicit n:Numeric[T]):T = n.fromInt(x)
但这没有用。有没有办法让上面的代码工作?
答案 0 :(得分:1)
你可以将multiply-by-int方法设法化为数字类型:
import Numeric.Implicits._
implicit class RichNumeric[A](val a: A) extends AnyVal {
def *(i: Int)(implicit n: Numeric[A]) = n.times(a, n.fromInt(i))
}
def f[T: Numeric](a: T) = a * 2
答案 1 :(得分:1)
怎么样:
implicit class NumericInt(x:Int){
def nu[T](implicit n: Numeric[T]) = n.fromInt(x)
}
import Numeric.Implicits._
def f[T: Numeric](a: T) = a * 2.nu
示例:
scala> def f[T: Numeric](a: T) = a * 2.nu
f: [T](a: T)(implicit evidence$1: Numeric[T])T
scala> f(5)
res0: Int = 10
答案 2 :(得分:1)
我认为该定义应如下:
import Numeric.Implicits._
def f[T <% Numeric[T]#Ops](a: T)(implicit f: Int => T) = a * 2
println(f(5)) // 10
println(f(BigDecimal(7))) // 14
println(f(1.7)) // 3.4