Ho una serie di classi di tipi di archivio dati che sembrano tutte uguali.Tipi di metodi dipendenti e classi di tipi
trait FooStore[C] {
def create(f: FooId => Foo)(c: C): Foo
// update and find methods
}
vorrei semplificare le cose e speravo di utilizzare i tipi di metodo dipendenti per ottenere qualcosa di più vicino 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
}
ma quando provo e creare un'istanza di quella come segue
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")
}
}
ottengo il seguente errore di compilazione
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
Non capisco poiché questo metodo è chiaramente definito sull'istanza DataStore
. Cosa significa l'errore ed è possibile? Se no, c'è un modo diverso per realizzare la stessa cosa?
solo controllando ... stai compilando con '-Yyependent-method-types'? – mergeconflict
@mergeconflict: sì, la compilazione con tipi di metodo dipendenti – purefn