たとえば、ブール論理の定義域を表現しようとしていると仮定します(今のところ削減は無視します)。したがって、ストアにはBools、Ands、Ors、Notsなどのインスタンスがあります。ただし、これらのことを具体的に表現する一方で、多くの場合、気になるのは、何かができるということだけです。ブール値、または2つのブール値の組み合わせとして表示されます(これはここではまったく意味がありませんが、より大きな例は、色が付いている可能性のあるすべてのものを要求する可能性のある、ある種の異種データストアです)。複数の潜在的な階層があるため、サブクラス化は実際にはそれをカットしません。明示的な変換を避けたいので、型クラスが進むべき道のようです。だから私はこのようなものを持っています:
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]
、適切な代理人に電話してもらうことができます。これは暗黙的に推測可能である必要がありますか?