关于类型类的问题

时间:2011-02-02 12:15:48

标签: scala implicit typeclass

我需要按如下方式定义类型类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)
           ^

2 个答案:

答案 0 :(得分:7)

你几乎得到了它。你只需做出这个小改动:

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

答案 1 :(得分:3)

你的解决方案几乎是正确的,但你应该像这样定义func:

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

正如您现在定义的那样,F必须是Field(或Field的子类型),而不仅仅是可转换为一个。 “F&lt;%Field”表示法意味着所有具有到Fields的隐式转换的值也是可接受的。如果你在调用func(2)的范围内的某个地方创建了一个隐式的Field [Int]实例,那么第二个解决方案也会有效。