繁体   English   中英

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

[英]Scala: hierarchy of typeclasses and implicit resolution

假设我要表示布尔逻辑的域(暂时忽略约简)。 因此,我将在商店中使用Bools,Ands和Ors or 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]并获得适当的委托。 这应该隐含地推论吗?

解决了-如果我改变

trait Delegated[-B, +A]

trait Delegated[B,A]

然后这个工作。 鉴于注释是通过其他处理方式留下的,这似乎是一个很好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM