2017-07-30 19 views
0

我學習型類階的總和,當我看着List.sum的實施,我就出來了一個問題,使用類型的類來計算每個字符串的長度

我有串名單,說,val x = List("one","two,"three"),我想計算每個字符串的長度的總和,即x.map(_.length).sum,但我會嘗試使用類型類來實現它。看起來,我不能通過提供Numeric [String]的實例來使用List.sum,我會問是否可以用類型模式來做到這一點,無論是定義一個新類型類還是使用現有類。

回答

1

你說得對,只是實現字符串的Numeric將不起作用,因爲sum方法被定義爲返回數字定義的類型,這將是一個字符串。

也許像這樣?

trait SummableAsInt[A] { 
    def plus(n: Int, a: A): Int 
} 

def sumListAsInt[A, B >: A](xs: List[A])(implicit s: SummableAsInt[B]): Int = { 
    xs.foldLeft(0)(s.plus) 
} 

implicit val StringSumAsInt: SummableAsInt[String] = new SummableAsInt[String] { 
    def plus(n: Int, s: String): Int = s.length + n 
} 

而且它可以像使用:

sumListAsInt(List("abc", "def", "ghi")) 

如果你想在同一x.sum語法,而不是sum(x),你可以用,而不是一個隱含的類做到這一點:

implicit class ListOps[A](xs: List[A]) [ 
    def sumAsInt[B >: A](implicit s: SummableAsInt[B]): Int = { 
    xs.foldLeft(0)(s.plus) 
    } 
} 

List("abc", "def", "ghi").sumAsInt 
+0

感謝@喬-K。你發佈的anwser應該工作,謝謝 – Tom