Type Class

《Demystifying Implicits and Typeclasses in Scala》一文的整理翻译。

The idea of typeclasses is that you provide evidence that a class satisfies an interface。

类型类思想是你提供了一个满足于一个接口证明

trait CanFoo[A] {
  def foos(x: A): String
}

case class Wrapper(wrapped: String)

object WrapperCanFoo extends CanFoo[Wrapper] {
  def foos(x: Wrapper) = x.wrapped
}

类型类思想是你提供了一个(Wrapper)满足于一个接口*(CanFoo)的证明(WrapperCanFoo)。

Wrapper不是直接的去继承一个接口,类型类让我们把类的定义和接口的实现分开。这表示,我可以为你的类实现一个接口,或者第三方可以为你的类实现我的接口,并且一切基本结束工作。

但是有一个明显的问题,如果你想把一个东西实现为CanFoo,你需要同时询问你的调用者类的实例和协议。

def foo[A](thing: A, evidence: CanFoo[A]) = evidence.foos(thing)