2012-03-25 15 views
7

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?

+0

acaba de comprobar ... ¿está compilando con '-Ydependent-method-types'? – mergeconflict

+0

@mergeconflict: sí, compilando con tipos de métodos dependientes – purefn

Respuesta

7

Compila utilizando el hito Scala-2.10-M2, algunos errores de tipo de método dependiente se han corregido desde la versión 2.9. No estoy del todo seguro, pero tal vez this one podría haberlo hecho funcionar.

+0

Estoy de acuerdo con @Arjan ... me funciona con la última versión 2.10.0-SNAPSHOT, y SI-5033 parece el culpable. –

+0

¡Genial! ¡Gracias chicos! ¿Qué hay de la 2.9.2 RC? No tengo un entorno para probarlo fácilmente. Creo que tendré que conseguir uno pronto. – purefn

Cuestiones relacionadas