0

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

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]并获得合适的代表。这应该是隐含的推断吗?

4

1 回答 1

0

解决了 - 如果我改变

trait Delegated[-B, +A]

trait Delegated[B,A]

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

于 2012-08-30T12:10:37.617 回答