2012-03-25 2 views
7

У меня есть куча типов классов данных, которые выглядят одинаково.Типы зависимых типов и типы классов

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. Что означает ошибка и это возможно? Если нет, есть ли другой способ сделать то же самое?

+0

просто проверка ... вы компилируете с помощью '-Ydependent-method-types'? – mergeconflict

+0

@mergeconflict: да, компиляция с зависимыми типами методов – purefn

ответ

7

Он компилируется с использованием знака Scala-2.10-M2, некоторые ошибки зависимого типа метода были исправлены с момента выпуска 2.9. Я не совсем уверен, но, возможно, this one, возможно, заставил его работать.

+0

Я согласен с @Arjan ... он работает для меня с последним 2.10.0-SNAPSHOT, а SI-5033 выглядит скорее как виновник. –

+0

Отлично! Спасибо, парни! Что относительно 2.9.2 RC? У меня нет среды, чтобы легко ее протестировать. Полагаю, мне нужно будет скоро это сделать. – purefn

Смежные вопросы