定义Scala中从Int到Numeric的隐式转换

时间:2014-12-21 21:54:52

标签: scala implicit-conversion

我希望能够在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)

但这没有用。有没有办法让上面的代码工作?

3 个答案:

答案 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