У меня есть куча типов классов данных, которые выглядят одинаково.Типы зависимых типов и типы классов
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
. Что означает ошибка и это возможно? Если нет, есть ли другой способ сделать то же самое?
просто проверка ... вы компилируете с помощью '-Ydependent-method-types'? – mergeconflict
@mergeconflict: да, компиляция с зависимыми типами методов – purefn