Странное несоответствие типов при использовании доступа к членам вместо экстрактора

Дан кортеж с элементами типа A и параметризованным другим типом в A:

trait Writer[-A] { def write(a: A): Unit }
case class Write[A](value: A, writer: Writer[A])

И сайт использования:

trait Cache { def store[A](value: A, writer: Writer[A]): Unit }

Почему следующее работает должным образом, используя экстрактор кортежа:

def test1(set: Set[Write[_]], cache: Cache): Unit =
  set.foreach {
    case Write(value, writer) => cache.store(value, writer)
  }

Но следующее не работает:

def test2(set: Set[Write[_]], cache: Cache ): Unit =
  set.foreach { write =>
    cache.store(write.value, write.writer)
  }

с сообщением об ошибке

 found   : Writer[_$1] where type _$1
 required: Writer[Any]
             cache.store(write.value, write.writer)
                                        ^

Могу ли я исправить вторую форму (test2) для правильной компиляции?

РЕДАКТИРОВАТЬ

Отходя от идей Оуэна, я попытался заставить его работать вообще без сопоставления с образцом (это то, что я хотел в первую очередь). Вот еще два странных случая, один рабочий, другой нет:

// does not work
def test3(set: Set[Write[_]], cache: Cache): Unit = {
  def process[A](write: Write[A]): Unit =
    cache.store(write.value, write.writer)

  set.foreach(process)
}

// _does work_
def test4(set: Set[Write[_]], cache: Cache): Unit = {
  def process[A](write: Write[A]): Unit =
    cache.store(write.value, write.writer)

  set.foreach(w => process(w))
}

Мне все еще малопонятно...

6
задан 0__ 27 September 2013 в 19:07
поделиться