Scala: иерархия классов типов и неявное разрешение
Предположим, я пытаюсь представить, скажем, область булевой логики (пока игнорируя сокращение). Так что в моем магазине будут экземпляры Bools, Ands, Ors, Nots и т. Д. Однако, хотя у меня будут конкретные представления об этих вещах, во многих случаях все, о чем я буду заботиться, это что-то, скажем, может быть рассматривается как Bool или как комбинация двух Bools (здесь это не совсем имеет смысла, но более крупный пример - это некое разнородное хранилище данных, где я мог бы запросить, скажем, все вещи, которые могут иметь цвет). Существует несколько потенциальных иерархий, поэтому подклассы на самом деле не сокращают их, и, поскольку я хочу избежать явного преобразования, классы типов, похоже, являются подходящим вариантом. Итак, у меня есть что-то вроде этого:
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 ответ
Решил - если я изменюсь
trait Delegated[-B, +A]
в
trait Delegated[B,A]
тогда это работает. Учитывая, что аннотации были перенесены из другого способа выполнения, это кажется хорошим решением.