2012-09-25 35 views
0

考慮初始值(0),我想實現一些功能,將適用Long => T爲整數a..b的範圍和積累T型的結果(這是運動,而不是有效的解決方案搜索)的數字參數化類型

def sum[T <: Number](f: Long => T)(a: Long, b: Long): T = { 
    def loop(acc: T, n: Long): T = 
    if (n > b) 
     acc 
    else 
     loop(acc + f(n), n + 1) 

    loop(0, a) 
} 

它的缺陷在loop(0,抱怨

error: type mismatch; 
found : Int(0) 
required: T 
    loop(0, a) 

我明白爲什麼,但什麼是給數字型T這裏的0的選項?如果有的話,當然。

回答

2

您應該使用Numeric型類的通用T。這會給你訪問方法zeroplus(因爲每一個Numeric必須定義這些),將允許你進行一般的總和。

def sum[T](f: Long => T)(a: Long, b: Long)(implicit num: Numeric[T]): T = { 
    def loop(acc: T, n: Long): T = 
    if (n > b) 
     acc 
    else 
     loop(num.plus(acc, f(n)), n + 1) 

    loop(num.zero, a) 
} 

順便說一句:這是Scala的內置sum方法做:

// from TraversableOnce 
def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus) 
+0

感謝,是它的唯一途徑? – dmitry

+0

在此答案:http://stackoverflow.com/a/4034176/978664所示的一些語法糖,所以類型PARAM可能被給定爲'[T:數值]'和'VAL NUM =隱式[數值[T]]' 。只是爲了協議。 – dmitry