2012-03-25 26 views
7

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?

+0

solo controllando ... stai compilando con '-Yyependent-method-types'? – mergeconflict

+0

@mergeconflict: sì, la compilazione con tipi di metodo dipendenti – purefn

risposta

7

Compilando la milestone Scala-2.10-M2, alcuni bug di tipo metodo dipendenti sono stati corretti dalla versione 2.9. Non ne sono completamente sicuro, ma forse lo this one potrebbe averlo fatto funzionare.

+0

Sono d'accordo con @Arjan ... funziona per me con l'ultimo 2.10.0-SNAPSHOT, e SI-5033 sembra probabile che sia il colpevole. –

+0

Ottimo! Grazie ragazzi! Che mi dici del 2.9.2 RC? Non ho un ambiente per testarlo facilmente. Immagino che dovrò prenderne uno presto. – purefn

Problemi correlati