2014-12-21 228 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