2011-02-02 28 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]实例,第二种解决方案也可以工作。