Зависимые типы методов и классы типов - PullRequest
8 голосов
/ 25 марта 2012

У меня есть куча классов типов хранилищ данных, которые выглядят одинаково.

trait FooStore[C] {
  def create(f: FooId => Foo)(c: C): Foo
  // update and find methods
}

Я хотел бы упростить вещи и надеялся использовать зависимые типы методов, чтобы получить что-то ближе к

sealed trait AR {
  type Id
  type Type
}

sealed trait FooAR extends AR {
  type Id = FooId
  type Type = Foo
}

trait DataStore[C] {
  def create(ar: AR)(f: ar.Id => ar.Type)(c: C): ar.Type
}

но когда я пытаюсь создать экземпляр этого следующим образом

case class InMemory(foos: List[Foo])
object InMemory {
  lazy val InMemoryDataStore: DataStore[InMemory] = new DataStore[InMemory] {
    def create(ar: AR)(f: ar.Id => ar.Type)(c: InMemory): ar.Type = sys.error("not implemented")
  }
}

Я получаю следующую ошибку компиляции

object creation impossible, since method create in trait DataStore of type (ar: AR)(f: ar.Id => ar.Type)(c: InMemory)ar.Type is not defined
  lazy val InMemoryDataStore: DataStore[InMemory] = new DataStore[InMemory] {
                                                        ^
one error found

Я не понимаю, поскольку этот метод довольно четко определен для экземпляра DataStore. Что означает ошибка и возможно ли это? Если нет, есть ли другой способ сделать то же самое?

1 Ответ

7 голосов
/ 25 марта 2012

Компилируется с использованием этапа Scala-2.10-M2, некоторые ошибки в зависимых типах методов были исправлены с момента выпуска 2.9.Я не совсем уверен, но возможно этот мог бы заставить его работать.

...