2011-02-02 58 views
4

我需要定義一個類型類Field如下:對類型類的一個問題

trait Field[A] { 
    // Additive identity 
    def zero: A 

    // Multiplicative identity 
    def one: A 
} 

Numeric型類還提供了方法,zeroone

我希望有一個Numeric實例可用的每個類都可以用於任何需要實例的類Field實例。例如,以下應該工作:

def func[F: Field](f: F) = println(f) 
func(2) 

你能建議如何做到這一點?我嘗試以下,但它沒有工作:

scala> implicit def numericToField[N](n: Numeric[N]) = new Field[N] { 
    |  def zero = n.zero 
    |  def one = n.one 
    | } 
numericToField: [N](n: Numeric[N])java.lang.Object with Field[N] 

scala> def func[F: Field](f: F) = println(f) 
func: [F](f: F)(implicit evidence$1: Field[F])Unit 

scala> func(2) 
<console>:12: error: could not find implicit value for evidence parameter of type Field[Int] 
     func(2) 
     ^

回答

7

你已經差不多了。你只需要做這個小改變:

scala> implicit def numericToField[N](implicit n: Numeric[N]) = new Field[N] { 
|  def zero = n.zero 
|  def one = n.one 
| } 
3

你的解決方案是非常接近正確的,但你應該定義FUNC像這樣:

def func[F <% Field](f:F) = println(f) 

正如你現在定義它,F必須是一個Field(或Field的一個子類型),不僅可以轉換爲一個。 「F <%字段」表示法意味着所有具有隱式轉換爲字段的值也是可以接受的。如果你在調用func(2)的範圍內創建了一個隱式的Field [Int]實例,第二種解決方案也可以工作。