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]

тогда это работает. Учитывая, что аннотации были перенесены из другого способа выполнения, это кажется хорошим решением.

Другие вопросы по тегам