Numeric
的實例本身不是數字,但它是提供操作來執行算術的對象。例如,Numeric[Int]
類型的對象num
可以添加兩個整數像這樣:num.plus(3, 5)
該操作的結果是整7.
對於整數,這是非常簡單。但是,對於所有基本數字類型,都有一個隱式Numeric
的實例可用。如果你定義你自己的數字類型,你可以提供一個。
因此,您應該打開A
的範圍,並添加一個類型爲Numeric[A]
的隱式參數,並使用該參數進行計算。就像這樣:
def **[A](l:List[A],m:List[A])(implicit num:Numeric[A])=l.zip(m).map({t=>num.times(t._1, t._2)})
當然,num.times(a,b)
看起來比a*b
那麼優雅。在大多數情況下,人們可以忍受這一點。但是,您可以在Ops
類型的對象,它支持運營商包的價值a
,就像這樣:
// given are: num:Numeric[A], a:A and b:A
val a_ops = num.mkNumericOps(a)
val product = a_ops * b
由於該方法mkNumericOps
聲明implicit
,你也可以導入並含蓄地使用它:
// given are: num:Numeric[A], a:A and b:A
import num._
val product = a * b
我會在哪裏把進口num._聲明我的**功能的情況下? – user44242 2010-12-14 09:00:08
您需要在等號後面打開一個塊。我沒有測試這個,但我想它應該看起來像這樣:'def ** [A](l:List [A],m:List [A])(implicit num:Numeric [A])= {import num._; l.zip(m).map({t => t._1 * t._2})}' - 儘管如此,我會努力去嘗試。我不確定隱式包裝Ops對象的創建是否會影響性能,或者是否會被編譯器優化。 – Madoc 2010-12-14 09:04:56
我希望如果啓用逃生分析,它應該進行優化,但沒有保證。 – 2010-12-14 18:39:37