2014-12-21 218 views
1

为数字我希望能够来定义斯卡拉以下功能:定义隐式转换从int斯卡拉

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:数字[T]参数和n.fromInt,但可读性受损。 (我想写真正的代码是比这更复杂。)

我试图定义从int到数字[T]的隐式转换:

implicit def intToNumericT[T](x:Int)(implicit n:Numeric[T]):T = n.fromInt(x) 

但这并不能帮助。有没有办法让上面的代码工作?

回答

1

你可以皮条客乘法通过-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 
+0

这样做的效果在于,我的客户端代码看起来是正确的,即使它有点乏味,因为我有皮条客的每一个参数,我可能需要一个隐式的Int - > Numeric [A]转换。我仍然不明白为什么我不能写一个隐式转换。 –

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 
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 
+0

当我尝试使用这个时,我得到:错误:在类型参数上不能同时具有隐式参数和上下文边界':...'或视图边界'<%...'。使用Scala 2.9.2。 –

+0

我使用了Scala 2.11.4 – user5102379