Tengo varias clases de tipos de almacén de datos que se ven todas iguales.Tipos de métodos dependientes y clases de tipos
trait FooStore[C] {
def create(f: FooId => Foo)(c: C): Foo
// update and find methods
}
me gustaría simplificar las cosas y tenía la esperanza de utilizar tipos de métodos dependientes de conseguir algo más cercano a
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
}
pero cuando intento y crear una instancia de esa de la siguiente manera
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")
}
}
me sale el siguiente error de compilación
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
No entiendo, ya que ese método está bastante claramente definido en la instancia DataStore
. ¿Qué significa el error y es esto posible? Si no, ¿hay una forma diferente de lograr lo mismo?
acaba de comprobar ... ¿está compilando con '-Ydependent-method-types'? – mergeconflict
@mergeconflict: sí, compilando con tipos de métodos dependientes – purefn