Как использовать ограничение типа с абстрактным типом

учитывая следующий код :

trait S { type T }
case class A(t: Seq[String]) extends S { type T = Seq[String] }

Я не понимаю эту ошибку компиляции : Похоже, что доказательства не используются.

def f[S<:A, X](g: => Seq[X])(implicit ev: S#T =:= Seq[X]) = new A(g)

<console>:50: error: type mismatch;
 found   : Seq[X]
 required: Seq[String]
       def f[S<:A, X](g: => Seq[X])(implicit ev: S#T =:= Seq[X]) = new A(g)

1 ответов


как глупо это может выглядеть, меняя порядка =:= операнды решают проблему

def f[S<:A, X](g: => Seq[X])(implicit ev: Seq[X] =:= S#T) = new A(g)

спасибо, scalac.

объяснение

когда вы говорите implicit ev S#T =:= Seq[X] компилятор обеспечивает неявное преобразование из S#T to Seq[X]. Однако он не обеспечивает эквивалентное преобразование из Seq[X] до S#T, и это глупая часть: разве равенство не должно быть коммутативным?

некоторые дополнительные сведения по этому вопросу здесь: http://typelevel.org/blog/2014/07/02/type_equality_to_leibniz.html