Трюк с дисперсией для зависимых от пути типов - PullRequest
0 голосов
/ 05 апреля 2011

Вот еще один для импликатов и зависимых от пути типов. Я не понимаю, почему мне нужно быть таким многословным: (Примечание - я нашел ответ, см. Ниже)

trait B
trait C[X]
trait A { def call[B1 <: B](implicit b: B1): C[B1] }
trait D extends B {
  def set(c: C[this.type]): Unit
}

первая попытка:

def test1(a: A)(implicit d: D: Unit =
  d.set(a.call) // found C[D] -- required C[d.type]

вторая попытка:

def test2(a: A)(implicit d: D): Unit =
  d.set(a.call[d.type]) // could not find implicit value for parameter b: d.type

третья попытка:

def test3(a: A)(implicit d: D): Unit =
  d.set(a.call[d.type](d))  // works. why so much clutter!?

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Вы уверены, что хотите this.type? «Этот тип» в Scala отличается от того, что более известно как « MyType ». См. это обсуждение на this.type, а также обсуждение, связанное с вопросом MyType.

1 голос
/ 05 апреля 2011

REPL Scala 2.9 помогает нам (спасибо, кто бы ни добавил это полезное сообщение!). Здесь для test1:

 found   : C[D]
 required: C[d.type]
Note: D >: d.type, but trait C is invariant in type X.
You may wish to define X as -X instead. (SLS 4.5)
              d.set( a.call ) // found C[D] -- required C[d.type]
                       ^

Таким образом: изменение trait C[ X ] на trait C[ -X ] заставляет test1 работать как положено.

...