Scala:类型类和隐式解析的层次结构

时间:2012-08-30 11:46:03

标签: scala typeclass implicit context-bound

假设我试图表示布尔逻辑的域(暂时忽略缩减)。所以我会在我的商店实例中包含Bools,Ands和Ors或Nots等等。但是,虽然我会对这些事情有具体的表述,但在很多情况下我所关心的是,有些东西可以说是被视为Bool,或者是两个Bool的组合(这在这里没有意义,但更大的例子是某种异构数据存储,我可能会要求,例如,所有可能有颜色的东西)。有多个潜在的层次结构,因此子类化并没有真正削减它,因为我想避免显式转换,所以类型类似乎是要走的路。所以我有这样的事情:

trait Delegated[-B, +A] {
  def bind(b : B) : A
}

trait Thing[A <: Thing[A]] {
  type Class[B] = Delegated[B,A]
}


trait BoolLike extends Thing[BoolLike] {
  def value : Boolean
}
class Bool(val value : Boolean) extends BoolLike

然而,现在,为了避免重复自己,我想指出,对于任何Thing,子类将满足Thing#Class。所以我对此的尝试如下:

implicit def SubclassIsClass[A <: Thing[A], B <: A] : A#Class[B] = new A#Class[B] { 
  def bind(b : B) = b
}

然而,如果我这样做

implicitly[BoolLike#Class[Bool]]

我没有得到任何证据,但我可以很高兴地致电SubclassIsClass[BoolLike, Bool]并获得一名合适的代表。这是否可以隐含地推断?

1 个答案:

答案 0 :(得分:0)

解决了 - 如果我改变了

trait Delegated[-B, +A]

trait Delegated[B,A]

然后这个工作。鉴于注释是从不同的做事方式遗留下来的,这似乎是一个很好的解决方案。