簡體   English   中英

Scala等價於Java的帶有除法的Number

[英]Scala equivalent of Java's Number with divide method

我想概括這個功能

def selfSufficiency(a: Seq[Double], b: Seq[Double]): Double = 
  a.sum/b.sum

我嘗試使用此處提供的想法來實現與Doubles,Floats,Ints等一起使用的更通用的功能:

def selfSufficiency[A](a: Seq[A], b: Seq[A])
     (implicit n: Numeric[A]):A = {
 import n._
 a.sum/b.sum
}

但是,我從日食中得到一句話說

值/不是類型參數A的成員。

1-如何以功能/通用的方式實現此功能?

2-我的實現是否限制用戶為兩個輸入使用相同的類型“ A”? 換句話說,我可以使用我的代碼嗎?

selfSufficiency(Seq(1,2,3), Seq(2.0,1.3))

如果不能,請說明如何實施?

請注意,此處的代碼提供了一個玩具示例。 在生產函數中,我加,減,找到較大的數字,依此類推。

問題在於Numeric不對除法函數進行編碼-您需要Fractional

因此,您的代碼成為

def selfSufficiency[A](a: Seq[A], b: Seq[A])
     (implicit n: Fractional[A]):A = {
 import n._
 a.sum/b.sum
}

現在就可以了。

編輯我剛剛閱讀了您問題的這一部分。

我的實現是否限制用戶為兩個輸入使用相同的類型“ A”? 換句話說,我可以使用我的代碼嗎?

由於FractionalNumeric都僅在一個T中參數化,因此兩個參數都必須來自同一類型-例如,請查看div 函數

但是,由於精度較低的數值是精度較高的數值的子類型(圖1) 您可以通過upcast使它正常工作,但是您需要更多地幫助編譯器。

selfSufficiency[Double](Seq(1,2,3), Seq(2.0,1.3)) // res1: Double = 1.8181818181818183

注意:如果不將類型指定為Double ,則編譯器將產生以下錯誤。

error: could not find implicit value for parameter n: Fractional[AnyVal]

圖。1

斯卡拉層次結構

參考: https : //www.artima.com/pins1ed/scalas-hierarchy.html

您正在尋找的是分數特征,它是支持div的更窄的數字(子類型)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM